gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:26:40 25 4
gpt4 key购买 nike

我正在尝试匹配输入,例如

<foo>
<bar>
#####<foo>
#####<bar>

我试过#{5}?<\w+> ,但它与 <foo> 不匹配和<bar> .

这种模式有什么问题,如何修复?

最佳答案

On ? 表示可选与不情愿

Java 正则表达式(以及其他一些风格)中的 ? 元字符可以有两种截然不同的含义,具体取决于它出现的位置。紧跟在重复说明符之后的 ? 是一个不情愿的量词,而不是“零或一”/“可选”重复说明符。

因此,#{5}? 并不意味着“可选地匹配 5 #”。事实上,它说的是“不情愿地匹配 5 #”。尝试匹配“恰好 5 个,但尽可能少”可能没有太大意义,但这实际上就是该模式的含义。

<小时/>

分组来救援!

解决此问题的一种方法是将可选模式分组为 (…)?。像这样的东西应该可以解决这个问题:

(#{5})?<\w+>

现在 ? 不会立即跟随重复说明符(即 *+?{…});它遵循用于分组的右括号。

或者,您也可以在这种情况下使用非捕获组(?:…):

(?:#{5})?<\w+>

这实现了相同的分组效果,但不会捕获到 \1 中。

引用文献

相关问题

<小时/>

奖励 Material :怎么样?

值得注意的是,你可以使用??来匹配一个可选的项目!

    System.out.println("NOMZ".matches("NOMZ??"));
// "true"

System.out.println(
"NOM NOMZ NOMZZ".replaceAll("NOMZ??", "YUM")
); // "YUM YUMZ YUMZZ"

注意,Z??是一个可选的Z,但它是勉强匹配的。 "NOMZ" 整体上仍匹配模式 NOMZ??,但在 replaceAll 中,NOMZ ?? 只能匹配 "NOM" 并且不必采用可选的 Z,即使它在那里。

相比之下,NOMZ?将贪婪地匹配可选的Z:如果它在那里,它就会接受它。

    System.out.println(
"NOM NOMZ NOMZZ".replaceAll("NOMZ?", "YUM")
); // "YUM YUM YUMZ"

相关问题

关于java - 为什么不呢?在此模式中充当可选的重复说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com