if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig)
$ replace可以是(股东),(所有者)等。
我一直收到这个错误。我检查了不正确的'(',')',没有骰子:(
Unmatched ) in regex; marked by <-- HERE in m/(\s|^|,|/|;|\|)Owner) <-- HERE (\s|$|,|/|;|\|)/
如果你能告诉我正则表达式的作用,那就太棒了。它会删除那些符号吗?谢谢你们!
答案 0 :(得分:15)
如果变量$ replace可以包含正则表达式元字符,则应将其包装在\Q...\E
\Q$replace\E
引用杰弗里弗里德的掌握正则表达式
文字文字范围序列 \ Q “引号”正则表达式元字符(即在它们前面放一个反斜杠)直到结束字符串,或直到 \ E 序列。
答案 1 :(得分:5)
如前所述,它会删除那些标点符号,然后是$ replace的内容,然后是更多的标点符号,并且它失败了,因为$ replace本身包含不匹配的括号。
然而,还有一些其他的一般正则表达式:首先,而不是将所有东西组合在一起(这只是为了简化逻辑和键入)我将它们放在一个字符类中。匹配[\s^,\/;\|]
可能不易出错且手指友好。
其次,除非你的意思是真的,否则不要使用一组()
分组括号。这会将捕获的字符串放在捕获缓冲区中,并在正则表达式引擎中产生开销。每perldoc perlre
:
警告:一旦Perl看到你需要一个$&amp; ,$`或$'在程序的任何地方,它必须为每个模式匹配提供它们。这可能会大大减慢您的计划。 Perl使用相同的机制生成1美元,2美元等,因此您还需要为包含捕获括号的每个模式支付价格。 Source
只需将?:
添加到括号中即可轻松解决此问题:
(?:[\s^,\/;\|])
编辑:并非您在该实例中需要非捕获分组,但它已经在原始正则表达式中。
答案 2 :(得分:3)
您的变量$replace
似乎包含字符串Owner)
,而不是(Owner)
。
$title = "Foo Owner Bar";
$replace = "Owner)";
if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig) {
print $title;
}
输出:
Unmatched ) in regex; marked by <-- HERE in m/(\s|^|,|/|;|\|)Owner)<-- HERE (\s |$|,|/|;|\|)/ at test.pl line 3.
$title = "Foo Owner Bar";
$replace = "(Owner)";
if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig) {
print $title;
}
输出:
FooBar