为什么我的Perl正则表达式抱怨正则表达式中"无与伦比"?

Thi*_*ode 9 regex perl

if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig)
Run Code Online (Sandbox Code Playgroud)

$ title可以是一系列的头衔,包括总裁,医学博士,首席运营官,首席执行官,......

$ replace可以是(股东),(所有者)等.

我一直收到这个错误.我检查了不正确的平衡'(',')',没有骰子:(

Unmatched ) in regex; marked by <-- HERE in m/(\s|^|,|/|;|\|)Owner) <-- HERE (\s|$|,|/|;|\|)/
Run Code Online (Sandbox Code Playgroud)

如果你能告诉我正则表达式的作用,那就太棒了.它会删除那些符号吗?多谢你们!

Pau*_*sey 15

如果变量$ replace可以包含正则表达式元字符,则应将其包装 \Q...\E

\Q$replace\E
Run Code Online (Sandbox Code Playgroud)

引用杰弗里弗里德的掌握正则表达式

文字文本跨度 序列\ Q "引号" 正则表达式元字符(即,在它们前面放置反斜杠)直到字符串结尾,或直到\ E序列.


Mar*_*ger 5

如上所述,它将删除那些标点符号,然后是$ replace的内容,然后是更多的标点符号,并且它失败了,因为$ replace本身包含不匹配的括号.

然而,还有一些其他的一般正则表达式:首先,而不是将所有东西组合在一起(这只是为了简化逻辑和键入)我将它们放在一个字符类中.匹配[\s^,\/;\|]可能不易出错且手指友好.

其次,()除非你真的是指它,否则不要使用分组括号.这会将捕获的字符串放在捕获缓冲区中,并在正则表达式引擎中产生开销.每个perldoc perlre:

警告:一旦Perl发现你需要程序中任何地方的$&,$`或$',它必须为每个模式匹配提供它们.这可能会大大减慢您的计划.Perl使用相同的机制生成1美元,2美元等,因此您还需要为包含捕获括号的每个模式支付价格.资源

你可以通过添加?:到括号中来改变它来轻松解决这个问题:

(?:[\s^,\/;\|])

编辑:并不是说您需要在该实例中进行非捕获分组,但它已经在原始正则表达式中.