代码之家  ›  专栏  ›  技术社区  ›  Roman

空字符串的模式是什么?

  •  8
  • Roman  · 技术社区  · 14 年前

    我需要验证输入:有效的变量是数字或空字符串。什么是相应的正则表达式?

    String pattern = "\d+|<what shoudl be here?>";
    

    UPD:请不要建议“\d*”,我只是好奇如何在regexp中分辨“空字符串”。

    7 回复  |  直到 14 年前
        1
  •  16
  •   Wiktor Stribiżew    7 年前

    在这种情况下, ^\d*$ pattern 或空字符串,可以使用:

    ^$|pattern
    

    • ^ $ 分别是锚索的起点和终点。
    • | this|that .

    相关问题


    关于多行模式的注记

    在所谓的多行模式下( Pattern.MULTILINE/(?m) 在Java中 $ 匹配项目的开始和结束 相反。现在,开始和结束字符串的锚点 \A \Z

    如果处于多行模式,则空字符串将与 \A\Z 相反。 ^$ 将匹配字符串中的空行。


    以下是一些例子来说明以上几点:

    String numbers = "012345";
    
    System.out.println(numbers.replaceAll(".", "<$0>"));
    // <0><1><2><3><4><5>
    
    System.out.println(numbers.replaceAll("^.", "<$0>"));
    // <0>12345
    
    System.out.println(numbers.replaceAll(".$", "<$0>"));
    // 01234<5>
    
    numbers = "012\n345\n678";
    System.out.println(numbers.replaceAll("^.", "<$0>"));       
    // <0>12
    // 345
    // 678
    
    System.out.println(numbers.replaceAll("(?m)^.", "<$0>"));       
    // <0>12
    // <3>45
    // <6>78
    
    System.out.println(numbers.replaceAll("(?m).\\Z", "<$0>"));     
    // 012
    // 345
    // 67<8>
    

    关于Java的注释 matches

    比赛 尝试将模式与 .

    String.matches Pattern.matches Matcher.matches

    比赛

    相关问题

        2
  •  6
  •   KaptajnKold    14 年前
    /^\d*$/
    

    匹配0个或多个数字,前后无任何内容。

    “^”表示行的开头。“$”表示行尾匹配0个或多个事件。所以模式匹配一整行0或更多的数字。

        3
  •  3
  •   Tim Pietzcker    14 年前

    要显式匹配空字符串,请使用 \A\Z

    你也可以经常看到 ^$ 除非选项设置为允许 ^ $ 锚不仅要在字符串的开始或结束处匹配,而且要在每行的开始/结束处匹配。如果您的输入不能包含换行符,那么当然 ^$ 完全可以。

    一些regex风格不支持 \A \Z 锚(尤其是JavaScript)。

    如果您想允许“空”如“无或只有空白”,那么去 \A\s*\Z ^\s*$ .

        4
  •  1
  •   unbeli    14 年前

    作为一个有趣的解决方案,您可以:

    \d+|\d{0}
    

    一个数字,零次。是的,确实有用。

        5
  •  0
  •   umop    14 年前

    你的行为不应该有什么问题 "\d+|"

        6
  •  0
  •   Konstantin Burlachenko    9 年前

    其中一种方式是将规则语言集视为以下事物的闭包:

    1. 特殊<空字符串>是常规语言吗
    2. alphaphet中的任何符号都是有效的正则语言
    3. 任何两种有效正规语言的联合就是正规语言
    4. regexp的任何可传递闭包都是正则语言

    Concreate正则语言是这个闭包的具体元素。


    POSIX standard 表达第(1)步中的常规语言思想。

    但也有一些额外的东西,比如问号,按照posix的定义是:

    (regexp |<空字符串(>)

    因此,对于bash、perl和python,可以采用以下方式:

    echo 9023 | grep -E "(1|90)?23"
    perl -e "print 'PASS' if (qq(23) =~ /(1|90)?23/)"
    python -c "import re; print bool(re.match('^(1|90)?23$', '23'))"
    
        7
  •  0
  •   Wiktor Stribiżew    8 年前

    要使任何匹配整个字符串的模式成为可选的,即允许模式匹配空字符串,请使用 可选组

    ^(pattern)?$
    ^^       ^^^
    

    regex demo

    如果regex引擎允许(如在Java中),则首选非捕获组,因为其主要目的是仅对子模式进行分组,而不是保留捕获的子值:

    ^(?:pattern)?$
    

    这个 ^ \A 可用于多种口味, $ \z 可用于搭配多种口味的终端,也可用于Java),以及 (....)? 将匹配1或0(由于 ? 序列 括号内的子模式。

    Java用法说明:在中使用时 matches() ,首字母 ^ 和尾随 $ 可以省略,您可以使用

    String pattern = "(?:\d+)?";