- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在浏览 Java Tutorial on Quantifiers .
在 Differences Among Greedy, Reluctant, and Possessive Quantifiers 中提到了差异。
我无法理解到底有什么区别。
解释如下:
Enter your regex: .*foo // greedy quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
Enter your regex: .*?foo // reluctant quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.
Enter your regex: .*+foo // possessive quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.
第一个示例使用贪婪量词 .* 查找“任何东西”,零次或多次,后跟字母“f”“o”“o”。因为量词是贪婪的,表达式的 .* 部分首先吃掉整个输入字符串。此时,整体表达式无法成功,因为最后三个字母(“f”“o”“o”)已经被消耗掉了。因此,匹配器一次缓慢地退回一个字母,直到最右边出现的“foo”被反刍,此时匹配成功,搜索结束。
然而,第二个例子不太情愿,所以它首先消费“无”。因为“foo”没有出现在字符串的开头,它被迫吞下第一个字母(一个“x”),这在 0 和 4 处触发了第一个匹配。我们的测试工具继续这个过程,直到输入字符串是筋疲力尽的。它在 4 和 13 处找到另一个匹配项。
第三个示例找不到匹配项,因为量词是所有格。在这种情况下,整个输入字符串都被 .*+ 消耗掉了,没有留下任何东西来满足表达式末尾的“foo”。在您想要捕获所有东西而不退缩的情况下使用所有格量词;在没有立即找到匹配项的情况下,它将优于等效的贪婪量词。
最佳答案
懒惰(不情愿)和贪婪情况的主要区别在于回溯结构的行为,而所有格情况过于激进!
f
的匹配,因此只要您有一个 foo
短语,您就会得到一个匹配项,这就是为什么我们从其用法中获取多个匹配项。.*?foo
xfooxxxxxxfoo
At the beginning, lazy case will have a successful match with thex
(after successful empty match) and pass the focus to the next operator;foo
part of the regex, and since that is present afterx
, we get a match for this fragment, same idea for the secondary part of the string.
.*foo
xfooxxxxxxfoo
When the greedy case is at this point (last char) the matching will fail since we couldn't match thefoo
part of the regex. Than the backtracking will force the greedy case tobacktrace
its steps and enforce the next operatorfoo
, similar of lazy case;
xfooxxxxxxfoo
At this point, thefoo
part will get a successful match, and thus ending with a successful match of the whole string.
回溯
,占有式情况并非如此。若能匹配,则拥有,并在此过程中牺牲匹配成功。如果匹配字符失败,焦点才会传递给正则表达式的下一个运算符。.*+foo
xfooxxxxxxfoo
Similar of greedy case, we have reached to the end of the string, but possessive case can still match it, thus will not pass the torch to thebacktrack
structure, and will cause a matching failure.
关于java - 理解量词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41956675/
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!