Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“(?:|……)”在Ruby正则表达式中是什么意思?_Ruby_Regex - Fatal编程技术网

“(?:|……)”在Ruby正则表达式中是什么意思?

“(?:|……)”在Ruby正则表达式中是什么意思?,ruby,regex,Ruby,Regex,在阅读《工程长效软件:使用SaaS和云计算的敏捷方法》时,我遇到了以下正则表达式(第5章,第5.3节介绍Cucumber和Capybara): 我知道非捕获(?:…)语法,但我不明白冒号后第一个管道字符的含义。是打字错误吗?它有什么特殊用途吗?正则表达式中的管道表示替代。在本例中,它表示空字符串“和字符串“I”之间的交替,正则表达式中的管道表示交替。在本例中,它表示空字符串“和字符串“I”之间的交替,它只是或。它可以不匹配任何内容或I(带空格)。其余的是你提到的非捕获组 正则表达式匹配类似于我正

在阅读《工程长效软件:使用SaaS和云计算的敏捷方法》时,我遇到了以下正则表达式(第5章,第5.3节介绍Cucumber和Capybara):


我知道非捕获
(?:…)
语法,但我不明白冒号后第一个管道字符的含义。是打字错误吗?它有什么特殊用途吗?

正则表达式中的管道表示替代。在本例中,它表示空字符串
和字符串
“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 (.+)$/