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

时间:2010-03-16 22:02:23

标签: regex perl

if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig)
$ title可以是一系列的头衔,包括总裁,医学博士,首席运营官,首席执行官...... </p> <p> $ replace可以是(股东),(所有者)等。</p> <p>我一直收到这个错误。我检查了不正确的'(',')',没有骰子:( </p> <pre><code>Unmatched ) in regex; marked by <-- HERE in m/(\s|^|,|/|;|\|)Owner) <-- HERE (\s|$|,|/|;|\|)/ </code></pre> <p>如果你能告诉我正则表达式的作用,那就太棒了。它会删除那些符号吗?谢谢你们!</p> </div> <div class="answer-list"> <h4>3 个答案:</h4> <div class="hr-line-dashed"></div> <p>答案 0 :(得分:15)</p> <div class="answer markdown-body"> <p>如果变量$ replace可以包含正则表达式元字符,则应将其包装在<code>\Q...\E</code> </p>中 <pre><code>\Q$replace\E </code></pre> <p>引用杰弗里弗里德的掌握正则表达式</p> <BLOCKQUOTE>   <p> <strong>文字文字范围</strong>序列<strong> \ Q </strong>“引号”<em>正则表达式</em>元字符(即在它们前面放一个反斜杠)直到结束字符串,或直到<strong> \ E </strong>序列。</p> </BLOCKQUOTE> </div> <div class="hr-line-dashed"></div> <p>答案 1 :(得分:5)</p> <div class="answer markdown-body"> <p>如前所述,它会删除那些标点符号,然后是$ replace的内容,然后是更多的标点符号,并且它失败了,因为$ replace本身包含不匹配的括号。</p> <p>然而,还有一些其他的一般正则表达式:首先,而不是将所有东西组合在一起(这只是为了简化逻辑和键入)我将它们放在一个字符类中。匹配<code>[\s^,\/;\|]</code>可能不易出错且手指友好。</p> <p>其次,除非你的意思是真的,否则不要使用一组<code>()</code>分组括号。这会将捕获的字符串放在捕获缓冲区中,并在正则表达式引擎中产生开销。每<code>perldoc perlre</code>:</p> <p>警告:一旦Perl看到你需要一个$&amp; ,$`或$'在程序的任何地方,它必须为每个模式匹配提供它们。这可能会大大减慢您的计划。 Perl使用相同的机制生成1美元,2美元等,因此您还需要为包含捕获括号的每个模式支付价格。 <a href="http://perldoc.perl.org/perlre.html" rel="nofollow noreferrer">Source</a> </P> <p>只需将<code>?:</code>添加到括号中即可轻松解决此问题:</p> <P> <code>(?:[\s^,\/;\|])</code> </P> <p>编辑:并非您<em>在该实例中需要</em>非捕获分组,但它已经在原始正则表达式中。</p> </div> <div class="hr-line-dashed"></div> <p>答案 2 :(得分:3)</p> <div class="answer markdown-body"> <p>您的变量<code>$replace</code>似乎包含字符串<code>Owner)</code>,而不是<code>(Owner)</code>。</p> <HR /> <pre><code>$title = "Foo Owner Bar"; $replace = "Owner)"; if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig) { print $title; } </code></pre> <P>输出:</p> <pre>Unmatched ) in regex; marked by <-- HERE in m/(\s|^|,|/|;|\|)Owner)<-- HERE (\s |$|,|/|;|\|)/ at test.pl line 3. </pre> <HR /> <pre><code>$title = "Foo Owner Bar"; $replace = "(Owner)"; if($title =~ s/(\s|^|,|\/|;|\|)$replace(\s|$|,|\/|;|\|)//ig) { print $title; } </code></pre> <P>输出:</p> <pre><code>FooBar </code></pre> </div> </div> </div> <div class="right"> <div style="height:400px"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6263610230477973" data-ad-slot="2820756182" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div style="height:20px"></div> <div class="releated-question-wrapper"> <div class="header"> 相关问题 </div> <div class="hr-line-dashed"></div> <ul> <li> <a href="/q/610586">为什么Perl会在我的Win32 :: OLE脚本中抱怨裸词?</a> </li> <li> <a href="/q/682870">为什么我的Perl脚本抱怨“全局符号”$ connection“需要显式包名”?</a> </li> <li> <a href="/q/1451447">为什么我的Perl程序抱怨需要显式的包名?</a> </li> <li> <a href="/q/1821841">为什么我的Perl CGI抱怨“过早结束脚本标题”?</a> </li> <li> <a href="/q/2458490">为什么我的Perl正则表达式抱怨正则表达式中“无与伦比”?</a> </li> <li> <a href="/q/2513683">为什么我的Perl CGI脚本抱怨“找不到CGI / Simple.pm”?</a> </li> <li> <a href="/q/3802396">为什么perl2exe会抱怨“Unresolved symbol:Perl_Gthr_key_ptr”?</a> </li> <li> <a href="/q/6867218">为什么我的网页视图会抱怨错误?</a> </li> <li> <a href="/q/21345450">为什么Perl会抱怨\ Q .. \ E正则表达式部分中无法匹配的括号?</a> </li> <li> <a href="/q/37575010">为什么System.Data.SqlClient抱怨我的陈述?</a> </li> </ul> </div> <div class="releated-question-wrapper"> <div class="header"> 最新问题 </div> <div class="hr-line-dashed"></div> <ul> <li> <a href="/q/68614764">我写了这段代码,但我无法理解我的错误</a> </li> <li> <a href="/q/68614678">我无法从一个代码实例的列表中删除 None 值,但我可以在另一个实例中。为什么它适用于一个细分市场而不适用于另一个细分市场?</a> </li> <li> <a href="/q/68614175">是否有可能使 loadstring 不可能等于打印?卢阿</a> </li> <li> <a href="/q/68614313">java中的random.expovariate()</a> </li> <li> <a href="/q/68614125">Appscript 通过会议在 Google 日历中发送电子邮件和创建活动</a> </li> <li> <a href="/q/68615109">为什么我的 Onclick 箭头功能在 React 中不起作用?</a> </li> <li> <a href="/q/68615123">在此代码中是否有使用“this”的替代方法?</a> </li> <li> <a href="/q/68614097">在 SQL Server 和 PostgreSQL 上查询,我如何从第一个表获得第二个表的可视化</a> </li> <li> <a href="/q/68614427">每千个数字得到</a> </li> <li> <a href="/q/68615239">更新了城市边界 KML 文件的来源?</a> </li> </ul> </div> <div class=""> </div> </div> </div> <div> <script> var host = window.location.host; if (host == "www.thinbug.com") { (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); } </script> </body> </html>