Perl REGEX:非捕获组似乎无法正常工作

Min*_*ius 2 regex bash perl

我有perl正则表达式的这个bash语句:

echo $1 | perl -pe 's|(?:://).+?(?:/)|b|'
Run Code Online (Sandbox Code Playgroud)

打印这个:

httpbTesting/JS/displayName.js
Run Code Online (Sandbox Code Playgroud)

由此:

http://php2-mindaugasb.c9.io/Testing/JS/displayName.js
Run Code Online (Sandbox Code Playgroud)

我在期待:

http://b/Testing/JS/displayName.js
Run Code Online (Sandbox Code Playgroud)

也许我不了解非捕获组?我认为它们应该匹配,但不能捕捉(就像一个积极的前瞻和后面的组合).我错了吗?

anu*_*ava 5

你应该使用:

perl -pe 's|(//).+?(/)|$1b$2|'
Run Code Online (Sandbox Code Playgroud)

非捕获组并不意味着不会消耗输入文本.非捕获括号将正则表达式分组,因此您可以应用正则表达式运算符,但不捕获任何内容.

或者使用外观并避免捕获组:

echo "$1" | perl -pe 's|(?<=://).+?(?=/)|b|'
http://b/Testing/JS/displayName.js
Run Code Online (Sandbox Code Playgroud)

  • 或者`s |://\K. +?(?= /)| b |` - `\ K`(在真正的旧perls中不可用)设置消费开始的地方 (2认同)
  • 不同的是,在`(ab){2}`正则表达式中,你已经捕获了组返回引用,可用作`$ 1`但在`(ab){2}`你不能使用`$ 1` (2认同)