为什么不呢?在此模式中充当可选的重复说明符? - java

我正在尝试匹配输入

<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.PatternX{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的模式

java split regex-字符的任意组合 - java

我正在使用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:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

用Java中的正则表达式拆分 - java

我想用正则表达式java拆分字符串。例如:String: (5,4,a) 我想在下面拆分两个String:5 4,a 如果字符是逗号字符后的数字,请分割如果字符是逗号后的字母,请不要拆分我用[-|,]\\s*[^\\w] 但是没有权利 参考方案 您可以使用正向前瞻-一个告诉正则表达式引擎某个字符必须存在的请求,但不应将其作为匹配的一部分使用:"[(…