我正在尝试匹配输入
<foo>
<bar>
#####<foo>
#####<bar>
我尝试了#{5}?<\w+>
,但它与<foo>
和<bar>
不匹配。
这种模式有什么问题,如何解决?
参考方案
在?
上表示可选vs.
Java regex中的?
元字符(以及其他一些样式)根据其出现的位置可能具有两种截然不同的含义。紧跟在重复说明符之后的?
是一个不愿意的量词,而不是“零或一” /“可选”重复说明符。
因此,#{5}?
并不意味着“可选地匹配5个#
”。实际上,它说“不情愿地匹配5 #
”。尝试匹配“恰好5,但应尽可能少”可能没有太大意义,但这实际上就是这种模式的含义。
分组救援!
解决此问题的一种方法是将可选模式分组为(…)?
。这样的事情应该可以解决此问题:
(#{5})?<\w+>
现在,?
不会立即跟随重复说明符(即*
,+
,?
或{…}
);它紧随用于分组的右括号。
另外,在这种情况下,您也可以使用非捕获组(?:…)
:
(?:#{5})?<\w+>
这样可以达到相同的分组效果,但是不会捕获到\1
中。
参考资料
regular-expressions.info
Question Mark for Optional-是,但仅在适当位置放置
Brackets for Grouping
Repetition
Flavor comparison
java.util.regex.Pattern
:X{n}?
:X,正好n次
相关问题
regex{n,}?
== regex{n}
?(绝对不是!)
Difference between .*?
and .*
for regex
奖励材料:??
值得注意的是,您可以使用??
勉强匹配可选项!
System.out.println("NOMZ".matches("NOMZ??"));
// "true"
System.out.println(
"NOM NOMZ NOMZZ".replaceAll("NOMZ??", "YUM")
); // "YUM YUMZ YUMZZ"
请注意,Z??
是可选的Z
,但是勉强匹配。整个"NOMZ"
仍然是matches
模式NOMZ??
,但是在replaceAll
中,NOMZ??
只能匹配"NOM"
,即使存在,也不必采用可选的Z
。
相比之下,NOMZ?
将贪婪地匹配可选的Z
:如果存在,它将接受。
System.out.println(
"NOM NOMZ NOMZZ".replaceAll("NOMZ?", "YUM")
); // "YUM YUM YUMZ"
相关问题
method matches not work well
与其他口味不同,Java matches
针对整个String
的模式
我正在使用3个字符分割字符串:空格,破折号和逗号我想要的是能够使用这3个字符的任意组合进行拆分,例如:-,(破折号后跟逗号)或,--(逗号后加2破折号)或- , -(破折号,逗号间隔破折号)等 String address = "Sector -18B, Dwarka"; String[] addressParts = address.s…
使用正则表达式获取网址的最后一部分 - java如何使用正则表达式获取URL的最后部分,这是我的URL,我希望最后一个斜杠和#之间有一段句号http://mycompany.com/test/id/1234#this 所以我只想获取1234。我有以下内容,但并未删除“ #this”".*/(.*)(#|$)", 在为数据建立索引时,我需要这样做,所以不想使用URL类。 参考方案 怎么样…
Java中的“ <<”运算符 - java最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…
JAVA:字节码和二进制有什么区别? - javajava字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…
用Java中的正则表达式拆分 - java我想用正则表达式java拆分字符串。例如:String: (5,4,a) 我想在下面拆分两个String:5 4,a 如果字符是逗号字符后的数字,请分割如果字符是逗号后的字母,请不要拆分我用[-|,]\\s*[^\\w] 但是没有权利 参考方案 您可以使用正向前瞻-一个告诉正则表达式引擎某个字符必须存在的请求,但不应将其作为匹配的一部分使用:"[(…