[英]What is the pattern for empty string?
我需要验证输入:有效的变量是数字或空字符串。 相应的正则表达式是什么?
String pattern = "\d+|<what shoudl be here?>";
UPD:请不要建议“\\ d *”,我只是好奇如何在regexp中告诉“空字符串”。
在这种特殊情况下, ^\\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>
matches
注释 在Java中, matches
尝试将模式与整个字符串进行匹配。
这适用于String.matches
, Pattern.matches
和Matcher.matches
。
这意味着有时候,对于其他版本和/或其他Java正则表达式方法而言,对于Java matches
,可以省略锚点。
/^\d*$/
匹配0或更多数字之前或之后没有任何内容。
说明:
'^'表示行首。 '$'表示行尾。 '*'匹配0或更多次出现。 因此,模式匹配整个行与0或更多位数。
要显式匹配空字符串,请使用\\A\\Z
您还可以经常看到^$
工作正常,除非将该选项设置为允许^
和$
anchors不仅匹配字符串的开头或结尾,而且还匹配每行的开头/结尾。 如果您的输入永远不能包含换行符,那么^$
当然是完全正常的。
一些正则表达式风格不支持\\A
和\\Z
锚点(尤其是JavaScript)。
如果你想在“没有或只有空格”中允许“空”,那么去\\A\\s*\\Z
或^\\s*$
。
就像一个有趣的解决方案,你可以这样做:
\d+|\d{0}
一个数字,零次。 是的,它确实有效。
查看常规语言集合的方法之一是关闭以下内容:
Concreate常规语言是此闭包的具体元素。
我没有在POSIX标准中找到空符号来表达步骤(1)中的常规语言思想。
但是存在像posix定义那样的问号额外的东西如下:
(regexp | <EMPTY_STRING>)
所以你可以用以下方式为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'))"
只有"\\d+|"
应该没有任何问题
要使任何匹配整个字符串的模式可选,即允许模式匹配空字符串,请使用可选组 :
^(pattern)?$
^^ ^^^
请参阅正则表达式演示
如果正则表达式引擎允许(如在Java中),则首选非捕获组,因为其主要目的是仅对子模式进行分组,而不是保留捕获的子值:
^(?:pattern)?$
^
将匹配字符串的开头(或者\\A
可以在很多种情况下用于此), $
将匹配字符串的结尾(或者\\z
可用于匹配许多种类的最终结尾,而Java也是如此) ),和(....)?
将匹配括号内的子模式的1或0(由于?
量词) 序列 。
Java使用说明:在matches()
,可以省略初始^
和尾随$
,您可以使用
String pattern = "(?:\d+)?";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.