正则表达式中的前向引用



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

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

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

前向参考如何工作?

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

n引用尚未捕获任何内容的捕获组时,它将匹配空字符串。您可以在例如/(a)?b1/,匹配b

n引用模式中稍后出现的捕获组时,它通常还无法捕获任何内容。您可以在例如/1b(a)/,与ba

.您可能认为在重复中,以前的捕获会保留,以便/(2a(b))*/匹配abbab,但事实并非如此:在重复中,当新的匹配开始时,捕获将被重置。所以相反,它匹配abab而不是abbab

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

第二个"(amigo|(走!+"捕获:阿米戈阿米戈

第一个"(\2amigo|(走!+"没有。

行为取决于语言。

在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为空(:

相关内容

  • 没有找到相关文章

最新更新