在字符类中使用捕获名称

时间:2015-01-09 12:00:43

标签: regex perl

我希望匹配格式为/.*/.*的字符串,其中/可以是斜杠或其他字符,并获取分隔符之间的所有字符。此外,如果这个特殊字符被反斜杠,它不算作分隔符。

例如,如果输入字符串为/sr\/gs/wfd/,我想获得sr\/gs

我到目前为止的尝试如下(我还会捕获其余部分,以后再使用它):

/^(?<c>.)(?<my_match>(?:[^\k<c>]|(?<=\\)\k<c>)+)\k<c>(?<rest>.*)$/

奇怪的是,它在命令行(在Windows cmd下)正常工作:

echo /sd\/grs/ | perl -ne "print $+{my_match} if /^(?<c>.)(?<my_match>(?:[^\k<c>]|(?<=\\)\k<c>)+)\k<c>(?<rest>.*)$/"

打印:

sd\/grs

但是,当我在脚本中使用完全相同的正则表达式时,会引发编译错误:

Unrecognized escape \k in character class passed through in regex; marked by <-- HERE in
m/^(?<c>.)(?<my_match>(?:[^\k <-- HERE <c>]|(?<=\\)\k<c>)+)\k<c>(?<rest>.*)$/ at mytestscript.pl line 188.

该正则表达式的命令行和脚本有什么不同?当然欢迎任何其他正则表达式。

感谢。

2 个答案:

答案 0 :(得分:2)

(?<!\\)\/(.*?)(?<!\\)\/

你可以简单地使用它并抓住捕获。参见演示。

https://regex101.com/r/sH8aR8/41

答案 1 :(得分:1)

脚本和命令行之间的区别在于命令行中缺少-w