【问题标题】:Regular expression for a string contains characters not in a specific set字符串的正则表达式包含不在特定集合中的字符
【发布时间】:2014-09-12 15:12:56
【问题描述】:

我尝试使用 Java 中的正则表达式来确定字符串是否包含不在集合中的任何字符。

我有以下一组有效字符“@ADEFIKRVXY156”。空白字符可以忽略,可以认为是有效的。

输入将是一个由一系列字母数字字符或空格组成的字符串。如果输入的字符串包含不在我的有效集合中的任何字符,我想编写的正则表达式将使 Java 的 Pattern.matcher(String) 返回 true。如果字符串有一些有效字符和一些无效字符,则应将整个字符串评估为无效。唯一有效的情况是整个字符串仅包含有效集中的字符。现在必须根据有效字符集对字符串中的每个字符进行评估,而不是字符串匹配或模式匹配。

有效的示例输入(Java Pattern.matcher 应该返回 false): “@”、“F”、“F I”、“R I”

无效的示例输入(Java Pattern.matcher 应该返回 true): “4 I”、“FT”、“4 B”

感谢您的帮助

【问题讨论】:

  • 这是一个非常可爱的工具来测试你的正则表达式:regexr.com

标签: java regex string pattern-matching


【解决方案1】:

如果空字符串有效,则尝试[@ADEFIKRVXY156\\s]*(否则使用+ 而不是*)。

String[] valid    = { "@", " F", " F I", "R I" };
String[] notValid = { " 4 I", " FT", " 4 B" };
String pattern    = "[@ADEFIKRVXY156\\s]*";
for (String s : valid) 
    System.out.println(!s.matches(pattern));
for (String s : notValid) 
    System.out.println(!s.matches(pattern));

输出:

false
false
false
false
true
true
true

【讨论】:

    【解决方案2】:

    它允许出现在字符类中的一个或多个字符,

    [@ADEFIKRVXY156\\s]+
    

    代码:

    String[] valid    = { "@", " F", " F I", "R I" };
    String[] notValid = { " 4 I", " FT", " 4 B" };
    String pattern    = "[@ADEFIKRVXY156\\s]+";
    for (String s : valid) 
        System.out.println(!s.matches(pattern));
    for (String s : notValid) 
        System.out.println(!s.matches(pattern));
    

    【讨论】:

    • 您需要分别在开头和结尾添加锚 ^ 和 $ 以确保输入仅包含这些字符:/^[@ADEFIKRVXY156 ]+$/
    • 匹配方法不需要锚。
    • 您不能用文字空格指定空格,您必须使用转义序列,如 \\s
    【解决方案3】:

    如果您的目标是(Java Pattern.matcher 应该返回 true)无效并且您不打算使用匹配值,您应该使用否定字符类结构 [^

    这里有正则表达式:

    .*[^@ADEFIKRVXY156\s]
    

    DEMO

    当正则表达式找到不在您范围内的第一个字符时,它将返回 true。

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 1970-01-01
      • 2017-10-02
      • 2010-10-17
      • 1970-01-01
      • 2011-07-22
      • 2020-01-22
      • 1970-01-01
      • 2016-04-21
      相关资源
      最近更新 更多