“(?:|……)”在Ruby正则表达式中是什么意思?
在阅读《工程长效软件:使用SaaS和云计算的敏捷方法》时,我遇到了以下正则表达式(第5章,第5.3节介绍Cucumber和Capybara):“(?:|……)”在Ruby正则表达式中是什么意思?,ruby,regex,Ruby,Regex,在阅读《工程长效软件:使用SaaS和云计算的敏捷方法》时,我遇到了以下正则表达式(第5章,第5.3节介绍Cucumber和Capybara): 我知道非捕获(?:…)语法,但我不明白冒号后第一个管道字符的含义。是打字错误吗?它有什么特殊用途吗?正则表达式中的管道表示替代。在本例中,它表示空字符串“和字符串“I”之间的交替,正则表达式中的管道表示交替。在本例中,它表示空字符串“和字符串“I”之间的交替,它只是或。它可以不匹配任何内容或I(带空格)。其余的是你提到的非捕获组 正则表达式匹配类似于我正
我知道非捕获
(?:…)
语法,但我不明白冒号后第一个管道字符的含义。是打字错误吗?它有什么特殊用途吗?正则表达式中的管道表示替代。在本例中,它表示空字符串“
和字符串“I”
之间的交替,正则表达式中的管道表示交替。在本例中,它表示空字符串“
和字符串“I”
之间的交替,它只是或
。它可以不匹配任何内容或I
(带空格)。其余的是你提到的非捕获组
正则表达式匹配类似于我正在节食
和我正在节食
的内容,在上面的示例中,捕获第一组中的节食
在Rubular上试一试-它只是
或
。它可以不匹配任何内容或I
(带空格)。其余的是你提到的非捕获组
正则表达式匹配类似于我正在节食
和我正在节食
的内容,在上面的示例中,捕获第一组中的节食
在Rubular上试一试-(?:|某物)
(“无/空字符串或匹配项”)
与以下内容完全相同:
(?:某物)?
(“比赛,一次或没有”)
换句话说:非捕获子模式是可选的。(?:|某物)
(“无/空字符串或匹配项”)
与以下内容完全相同:
(?:某物)?
(“比赛,一次或没有”)
换句话说:非捕获子模式是可选的。不完全是。这与
(?:某物)?
@TimPietzcker:Hm,这是ruby特有的(我自己几乎没有ruby方面的经验),还是我遗漏了什么?啊,我在接受的答案中看到了你的解释,我现在明白了,谢谢;)@瑞肯:除了意义之外,你还需要确保行为是对等的??
将在某物之前尝试空字符串,这与(|某物)
相同,而?
将在空字符串之前尝试某物,因为贪婪属性。不完全相同。这与(?:某物)?
@TimPietzcker:Hm,这是ruby特有的(我自己几乎没有ruby方面的经验),还是我遗漏了什么?啊,我在接受的答案中看到了你的解释,我现在明白了,谢谢;)@瑞肯:除了意义之外,你还需要确保行为是对等的?
将在某物之前尝试空字符串,这与(|某物)
相同,而?
将在空字符串之前尝试某物,因为贪婪属性。哇。。。太明显了。看看@Wrikken提供的答案,为什么(?:| I)
不等同于(?:I)?
?@Alf:因为先尝试空字符串,并且只有在必要时才尝试“I”
。例如,(?:| a)a
将匹配字符串aa
两次<代码>(?:a)?a仅一次。感谢您的澄清。在irb
中测试我得到以下结果:>md1=“aa”。match/(?:| a)a/=>#
,而>md2=“aa”。match/(?:a)?a/=>#
@Alf Tim是正确的。由于您的md1
匹配“a”
,因此相同的正则表达式可以再次匹配字符串,总共匹配两次。对于第二个,md2
匹配“aa”
,因此它只匹配字符串一次。哇。。。太明显了。看看@Wrikken提供的答案,为什么(?:| I)
不等同于(?:I)?
?@Alf:因为先尝试空字符串,并且只有在必要时才尝试“I”
。例如,(?:| a)a
将匹配字符串aa
两次<代码>(?:a)?a仅一次。感谢您的澄清。在irb
中测试我得到以下结果:>md1=“aa”。match/(?:| a)a/=>#
,而>md2=“aa”。match/(?:a)?a/=>#
@Alf Tim是正确的。由于您的md1
匹配“a”
,因此相同的正则表达式可以再次匹配字符串,总共匹配两次。对于第二个字符串,md2
匹配“aa”
,因此它只匹配字符串一次。
/^(?:|I )am on (.+)$/