正则表达式中的前向引用
Forward reference in regex
以下正则表达式有什么区别?
(amigo|(go!))+
(amigo|(go!))+
它们都匹配相同的字符串。
https://regexr.com/3u62t
前向引用是如何工作的?
它实际上根本不起作用(尽管正如 Wiktor Stribiżew 指出的那样,它可以与其他正则表达式一起使用)。
当\n
引用一个没有捕获任何东西的捕获组时,它匹配空字符串。你可以在例如/(a)?b/
,匹配 b
.
当 \n
指的是模式中稍后出现的捕获组时,它通常还不能捕获任何东西。你可以在例如/b(a)/
,匹配 ba
.
您可能认为在重复中,之前的捕获会被保留,因此 /(a(b))*/
会匹配 abbab
,但事实并非如此:在重复中,当新的匹配开始时,捕获被重置。所以它匹配 abab
, 而不是 abbab
.
因此,前向引用完全无用,只能匹配空字符串。你的两种模式没有区别。
第二个“(amigo|(go!))+”捕获:amigoamigo
第一个“(\2amigo|(go!))+”没有。
行为取决于语言。
在Ruby和Perl中也可以使用前向引用,但一定要在引用的括号内
已匹配何时将要使用。这通常意味着前向引用
在一些重复组内。例如,在 Ruby 中,此正则表达式仅在以下情况下与 train
匹配
它至少有一个前缀 choo
:
$ irb
irb(main):052:0> regex = /(train|(choo))+/
=> /(train|(choo))+/
irb(main):053:0> 'choochootrain' =~ regex
=> 0
irb(main):054:0> $&
=> "choochootrain"
irb(main):055:0>
=> "chootrain"
irb(main):056:0>
=> "choo"
irb(main):004:0> 'train' =~ regex
=> nil
JavaScript不是这样的:
[~/.../github-actions/225-github-actions-demo(master)]$ node
Welcome to Node.js v13.5.0.
Type ".help" for more information.
> regex = /(train|(choo))+/
/(train|(choo))+/
> regex.exec('train')
[
'train',
'train',
undefined,
index: 0,
input: 'train',
groups: undefined
]
事实上,它匹配train
(假设
为空):
以下正则表达式有什么区别?
(amigo|(go!))+
(amigo|(go!))+
它们都匹配相同的字符串。 https://regexr.com/3u62t
前向引用是如何工作的?
它实际上根本不起作用(尽管正如 Wiktor Stribiżew 指出的那样,它可以与其他正则表达式一起使用)。
当\n
引用一个没有捕获任何东西的捕获组时,它匹配空字符串。你可以在例如/(a)?b/
,匹配 b
.
当 \n
指的是模式中稍后出现的捕获组时,它通常还不能捕获任何东西。你可以在例如/b(a)/
,匹配 ba
.
您可能认为在重复中,之前的捕获会被保留,因此 /(a(b))*/
会匹配 abbab
,但事实并非如此:在重复中,当新的匹配开始时,捕获被重置。所以它匹配 abab
, 而不是 abbab
.
因此,前向引用完全无用,只能匹配空字符串。你的两种模式没有区别。
第二个“(amigo|(go!))+”捕获:amigoamigo
第一个“(\2amigo|(go!))+”没有。
行为取决于语言。
在Ruby和Perl中也可以使用前向引用,但一定要在引用的括号内
已匹配何时将要使用。这通常意味着前向引用
在一些重复组内。例如,在 Ruby 中,此正则表达式仅在以下情况下与 train
匹配
它至少有一个前缀 choo
:
$ irb
irb(main):052:0> regex = /(train|(choo))+/
=> /(train|(choo))+/
irb(main):053:0> 'choochootrain' =~ regex
=> 0
irb(main):054:0> $&
=> "choochootrain"
irb(main):055:0>
=> "chootrain"
irb(main):056:0>
=> "choo"
irb(main):004:0> 'train' =~ regex
=> nil
JavaScript不是这样的:
[~/.../github-actions/225-github-actions-demo(master)]$ node
Welcome to Node.js v13.5.0.
Type ".help" for more information.
> regex = /(train|(choo))+/
/(train|(choo))+/
> regex.exec('train')
[
'train',
'train',
undefined,
index: 0,
input: 'train',
groups: undefined
]
事实上,它匹配train
(假设为空):