Skip to content Skip to sidebar Skip to footer

Forward Reference In Regex

What is the difference of the following regular expressions? (\2amigo|(go!))+ (amigo|(go!))+ They both match the same strings. https://regexr.com/3u62t How does the forward refere

Solution 1:

The second "(amigo|(go!))+" captures: amigoamigo

The first "(\2amigo|(go!))+ " doesn't.


Solution 2:

The behavior depends on the language.

In Ruby and Perl forward references can also be used, but be sure the referenced parenthesis has matched when is going to be used. This usually means that the forward reference is inside some repetition group. For example, in Ruby this regexp matches with train only if it is prefixed by at least one 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

This is not the case in 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
]

In fact, it does match train (The \2 is assumed empty):


Post a Comment for "Forward Reference In Regex"