空字符串的模式是什么?

时间:2010-07-27 09:37:59

标签: java regex

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

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

UPD:请不要提示“\ d *”,我只是好奇如何在regexp中告诉“空字符串”。

7 个答案:

答案 0 :(得分:15)

在这种特殊情况下,^\d*$会起作用,但一般来说,要匹配pattern或空字符串,您可以使用:

^$|pattern

解释

  • ^$分别是字符串锚点的开头和结尾。
  • |用于表示替代项,例如this|that

参考

相关问题


关于多线模式的注意事项

在所谓的多线模式(Java中为Pattern.MULTILINE/(?m))中,^$匹配行的开头和结尾。字符串开头和结尾的锚点现在分别为\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

的注释

在Java中,matches尝试将模式与整个字符串匹配

适用于String.matchesPattern.matchesMatcher.matches

这意味着有时,对于Java matches,当其他版本和/或其他Java正则表达式方法需要时,可以省略锚点。

相关问题

答案 1 :(得分:6)

/^\d*$/

匹配0位或更多位数字之前或之后没有任何内容。

说明:

'^'表示行首。 '$'表示行尾。 '*'匹配0或更多次出现。因此,模式匹配整数行,其中包含0位或更多位数。

答案 2 :(得分:3)

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

除非将选项设置为允许^$^锚点不仅匹配字符串的开头或结尾,而且还允许$工作正常在每一行的开头/结尾。如果你的输入永远不能包含换行符,那么^$当然是完全正常的。

某些正则表达式不支持\A\Z锚点(尤其是JavaScript)。

如果您想允许“空白”,如“没有或只有空白”,请转到\A\s*\Z^\s*$

答案 3 :(得分:1)

正如一个有趣的解决方案,你可以这样做:

\d+|\d{0}

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

答案 4 :(得分:0)

"\d+|"

应该没有任何问题

答案 5 :(得分:0)

查看常规语言集合的方法之一是关闭以下内容:

  1. 特别&lt; EMPTY_STRING&gt;是常规语言
  2. alphaphet中的任何符号都是有效的常规语言
  3. 两个有效正则表达式的任何连接和联合是常规语言
  4. 两种有效常规语言的任何结合是常规语言
  5. regexp的任何传递闭包都是常规语言
  6. Concreate常规语言是此闭包的具体元素。

    我没有在POSIX standard中找到空符号来表达步骤(1)中的常规语言构思。

    但是存在像posix定义那样的问号额外的东西如下:

      

    (regexp |&lt; EMPTY_STRING&gt;)

    所以你可以用以下方式处理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'))"
    

答案 6 :(得分:0)

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

^(pattern)?$
^^       ^^^

请参阅regex demo

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

^(?:pattern)?$

^将匹配字符串的开头(或者\A可以用于多种口味),$将匹配字符串的结尾(或\z可用于匹配多种风格的最终结果,也可用于匹配Java),(....)?将匹配1或0(由于?量词)序列括号内的子模式。

Java使用说明:在matches()中使用时,可以省略初始^和尾随$,您可以使用

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