【问题标题】:What's the difference between these two regular expressions? [duplicate]这两个正则表达式有什么区别? [复制]
【发布时间】:2020-06-06 23:27:42
【问题描述】:

问题的简短直接版本是:为什么这两个正则表达式不同?即,

href=(['"]).+?\1

href=(['"]).+?['"]href=(['"]).+?(['"])


我正在这个网站上练习正则表达式,我正在尝试解决这个级别

http://play.inginf.units.it/#/level/6

我将在此处发布全部内容,以防网站将来出现故障。

           <tr>
                          <a href="javascript:openurl('/Xplore/accessinfo.jsp')" class="topUnderlineLinks">
                                            <A href="/iel5/4235/4079606/04079617.pdf?tp=&arnumber=4079617&isnumber=4079606" class="bodyCopy">PDF</A>(3141 KB)&nbsp;
                        <A href='/xpl/RecentCon.jsp?punumber=10417'>Evolutionary Computation, 2005. The 2005 IEEE Congress on</A><br>
                <td width="33%" ><div align="right"> <a href="/xplorehelp/Help_start.html#Help_searchresults.html" class="subNavLinks" target="blank">Help</a>&nbsp;&nbsp;&nbsp;<a href="/xpl/contactus.jsp" class="subNavLinks">Contact
Kimya ile ilgili çeþitli temel referans
<a href="http://search.epnet.com/login.asp?profile=web&amp;defaultdb=geh"
<a href="http://iimpft.chadwyck.com/" target="_parent">International
<a href="standartlar.html#tse" target="_parent">NFPA Standartlarý</a>
<a href="http://www.gutenberg.org/" target="_parent">Project Gutenberg</a>
<a href="http://proquestcombo.safaribooksonline.com/?portal=proquestcombo&amp;uicode=istanbultek"
<a href="http://www.scitation.org" target="_parent">Scitation</a>
dergilerin listesini görmek için <a href="/online/aip.html">bu yolu</a>
<a href="http://www3.interscience.wiley.com/journalfinder.html"
               <td width="46%"><a href="/xpl/periodicals.jsp" class="dropDownNav" accesskey="j">Journals &amp; Magazines
               <td><a href="http://www.ieee.org/products/onlinepubs/resources/XploreTutorial.pdf" class="dropDownNav">IEEE Xplore Demo</a></td>
                          &nbsp;|&nbsp;&nbsp; <a href="/xpl/tocalerts_signup.jsp" class="topUnderlineLinks">Alerts</a>
                        <A href='/xpl/RecentCon.jsp?punumber=10417'>Evolutionary Computation, 2005. The 2005 IEEE Congress on</A><br>
                                    <a href="/search/srchabstract.jsp?arnumber=1554748&isnumber=33079&punumber=10417&k2dockey=1554748@ieeecnfs&query=%28+grammatical+evolution%3Cin%3Eti+%29&pos=9" class="bodyCopy">Abstract</a>
                                          <td><a href="history.jsp">View Session History</a></td>
                                          <td><a href="advsearch.jsp">New Search</a></td>
<a href="http://web5s.silverplatter.com/webspirs/start.ws?customer=kaynak"
<a href="standartlar.html#tse">Türk Standartlarý</a>
<a href="http://isiknowledge.com" target="_parent">Web of Science</a>
<a href='deneme.html#bg'>Butler Group </a>veritabanýna 31 Mart 2007 tarihine kadar deneme eriþimi alýnmýþtýr. &nbsp;<span class="tarih">(19.03.2007)</span> 
<a href='deneme.html#ps'>Productscan</a> veritabanýna 31 Mart 2007 tarihine kadar deneme eriþimi alýnmýþtýr. &nbsp;<span class="tarih">(19.03.2007)</span> 

我应该匹配这样的文本

href="history.jsp"

即我需要匹配以上文本中的任何href。

现在根据Solutions,似乎答案是href=(['"]).+?\1

但是最后一个反向引用,如果我不使用它并重复正则表达式组(我希望括号称为组,如果我错了,请纠正我),为什么我会得到不同的结果?也就是说,如果我使用它,我会得到错误的结果。 href=(['"]).+?['"]href=(['"]).+?(['"])

【问题讨论】:

  • @Ivar 谢谢,Ivar。其实我只是检查了那个问题。事实上,我在问这个问题之前在那里发表了评论,因为我无法通过查看反向引用的定义来解决这个问题。
  • 我正要添加一条额外的评论来解释你的用例,但由于你已经收到了答案,它不会增加太多价值。

标签: regex regex-group backreference


【解决方案1】:

反向引用必须匹配捕获组匹配的相同内容。所以第一个正则表达式会匹配

"abcd"

'abcd'

第二个版本没有链接匹配的两端,所以它也会匹配以下内容:

"abcd'

'abcd"

所以带有反向引用的版本只匹配被相同类型引号包围的字符串。

如果您在字符串中嵌入了引号,则这种差异很重要,例如

some text "<div id='foo'>" more text

带有后向引用的版本将匹配"&lt;div id='foo'&gt;",但没有后向引用的版本将匹配"&lt;div id='

【讨论】:

  • 非常感谢,这很有意义。我现在可以在这里看到反向引用的优势,因为它记住(或有记忆)在此之前捕获的内容是单引号或双引号。
【解决方案2】:

正则表达式 sn-p (['"]).+?\1 捕获带有 (...) 的开头引号,并使用反向引用稍后将其与 \1 一起使用。这意味着'xyzzy'"plugh" 将匹配但 'twisty"

这可能是正确的形式,因为 (['"]).+?['"] 可以使用任一引号打开和关闭。


顺便说一句,在后一个表达式中捕获组没有什么意义,除非您打算以某种方式在代码中使用它们。如果您捕获两者,您可以检查以确保它们相同,但这可能最好通过使用反向引用版本来处理。

换句话说,如果你想允许'twisty" 之类的东西,你只需要['"].+?['"]

【讨论】:

  • 哇,谢谢,我现在明白了。很有道理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
相关资源
最近更新 更多