我需要验证输入:有效变体是数字或空字符串。对应的正则表达式是什么?
String pattern = "\d+|<what shoudl be here?>";
UPD:请不要提示“\ d *”,我只是好奇如何在regexp中告诉“空字符串”。
答案 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>
matches
在Java中,matches
尝试将模式与整个字符串匹配。
适用于String.matches
,Pattern.matches
和Matcher.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)
查看常规语言集合的方法之一是关闭以下内容:
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+)?";