正则表达式中的前向引用

时间:2018-08-20 10:47:30

标签: javascript regex forward-reference

以下正则表达式有什么区别?

(\2amigo|(go!))+
(amigo|(go!))+

它们都匹配相同的字符串。 https://regexr.com/3u62t

前瞻性参考如何工作?

3 个答案:

答案 0 :(得分:1)

它实际上根本不起作用(尽管正如Wiktor Stribiewew指出的那样,它可以与其他正则表达式一起使用)。

\n指的是未捕获任何内容的捕获组时,它与空字符串匹配。您可以在例如/(a)?b\1/,与b匹配。

\n指的是在模式中稍后出现的捕获组时,它通常还不能捕获任何东西。您可以在例如/\1b(a)/,与ba匹配。

您可能会认为在重复中,先前的捕获会保留下来,因此/(\2a(b))*/将与abbab相匹配,但这不是这样的:重复中,当新的匹配开始时,捕获被重置。因此,它匹配abab abbab

因此,前向引用完全完全没有用,只能匹配空字符串。两种模式之间没有区别。

答案 1 :(得分:0)

第二个“(amigo |(go!))+”捕获:amigoamigo

第一个“(\ 2amigo |(go!))+”没有。

答案 2 :(得分:0)

行为取决于语言。

在 Ruby 和 Perl 中也可以使用前向引用,但要确保引用的括号 已匹配何时将被使用。这通常意味着前向引用 在某个重复组内。例如,在 Ruby 中,此正则表达式仅在以下情况下与 train 匹配 它以至少一个 choo:

为前缀
$ irb
irb(main):052:0> regex = /(\2train|(choo))+/
=> /(\2train|(choo))+/
irb(main):053:0> 'choochootrain' =~ regex
=> 0
irb(main):054:0> $&
=> "choochootrain"
irb(main):055:0> $1
=> "chootrain"
irb(main):056:0> $2
=> "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 = /(\2train|(choo))+/
/(\2train|(choo))+/
> regex.exec('train')
[
  'train',
  'train',
  undefined,
  index: 0,
  input: 'train',
  groups: undefined
]

事实上,它确实匹配 train(假设 \2 为空):