在字符中使用捕获名称 class

Use of a capture name inside a character class

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

比如输入的字符串是/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.

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

谢谢。

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

您可以简单地使用它并获取 capture.See 演示。

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

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