gpt4 book ai didi

java - 类勉强和简单类正则表达式的等价性

转载 作者:行者123 更新时间:2023-11-29 07:40:58 25 4
gpt4 key购买 nike

这个问题只是为了满足我的好奇心。考虑以下两个 Java 正则表达式:[, !.][, !.]+?。它们等价吗?我试图举出它们不等同的例子,但我找不到。

编辑:我知道为了匹配整个字符串,它们是不等价的。但是,当您使用它们在一个字符串中查找子字符串的多个匹配项时,它们对我来说似乎是等价的。

最佳答案

这是同一 String 中的一个独立示例,用于贪婪地、勉强地或没有量词匹配的字符类。

Pattern greedy = Pattern.compile("[, !.]+");
Pattern reluctant = Pattern.compile("[, !.]+?");
Pattern nonQuantified = Pattern.compile("[, !.]");
String example = "foo !! bar";
Matcher greedyMatcher = greedy.matcher(example);
Matcher reluctantMatcher = reluctant.matcher(example);
Matcher nonQMatcher = nonQuantified.matcher(example);
while (greedyMatcher.find()) {
System.out.printf("Greedy found: %s%n", greedyMatcher.group());
}
while (reluctantMatcher.find()) {
System.out.printf("Reluctant found: %s%n", reluctantMatcher.group());
}
while (nonQMatcher.find()) {
System.out.printf("Non-quantified found: %s%n", nonQMatcher.group());
}

输出

Greedy found:  !! 
Reluctant found:
Reluctant found: !
Reluctant found: !
Reluctant found:
Non-quantified found:
Non-quantified found: !
Non-quantified found: !
Non-quantified found:

解释

  • 贪心算法会尽可能匹配。因此,find 返回一次 true 并且 group() 凝聚整个匹配
  • 勉强者会尽可能少地匹配。因此,find 在“示例”Stringgroup 中每次匹配返回一次 true,调用 4 次,返回一个空格,一个 !,另一个 ! 和最后一个空格
  • 非量化每次调用只匹配一个字符,因此在这种情况下就像不情愿的量词一样
  • > Here是关于量词的官方文档
  • > Here是 Java Pattern 上的官方 API,对量词语法很有用

注意

  • 如前所述,您的问题显示了两个字符类别,但第一个未量化。
  • 我继续假设您打算将其量化为贪婪的,因此在我的示例中使用 [, !.]+,而不是非量化的 [, !.]在你的问题中

关于java - 类勉强和简单类正则表达式的等价性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30214414/

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