正则表达式:如何接受单引号和双引号但不能同时接受

时间:2014-08-24 00:19:47

标签: regex emacs elisp

我该如何匹配

<a href="logout.html">Logout</a>

这个

<a href='logout.html'>Logout</a>

编辑(并捕获 logout.html 注销

这个:

<a href="'.$var.'">'.$another_var.'</a>

现在我有了这个

"^.*<a.*href=\"\\([^\"]+\\)\"[^>]+>\\([^<]+\\)</a>"

但它只匹配双引号,并且也接受变量链接......

3 个答案:

答案 0 :(得分:2)

Avinash Raj解决引用问题的方法是可行的/更安全的:

<a .*?\bhref=\(['"]\)[^'"]*\1.*?>.*?</a>

作为字符串:

"<a .*?\\bhref=\\(['\"]\\)[^'\"]*\\1.*?>.*?</a>"

n.b。不要使用贪婪的操作员,这样做是不安全的!例如:<a.*href是一个相当糟糕的主意。

编辑:所以事实证明你只需要来自匹配的URL和链接文本,在这种情况下你会在那些附加组附加其他组:

"<a .*?\\bhref=\\(['\"]\\)\\([^'\"]*\\)\\1.*?>\\(.*?\\)</a>"

然后询问第2组和第2组匹配的字符串3。

在elisp中,您最有可能使用(match-string 2)&amp; (match-string 3),但这取决于您使用正则表达式的方式。

另请注意,正则表达式无法匹配平衡表达式,因此在这种情况下,它们始终无法提供完美的解决方案,并且您依赖于对数据的假设你正在处理。如果您的URL包含引号,则此正则表达式将失败。

当然,elisp通常对处理平衡表达式有很多支持,所以你可能会以更基本的形式匹配元素,然后使用forward-sexp从开头报价转到结束报价。更可靠的方式。显然,这个问题超出了这个问题的范围。

编辑2:显然我实际上必须证明这一点。

re-builder

与我原来的正则表达式之间的唯一区别是添加了额外的组,因为您后续编辑了问题。

答案 1 :(得分:1)

您可以使用此正则表达式:

<a href=["']\w+\.\w+["']>\w+<\/a>

<强> Working demo

enter image description here

答案 2 :(得分:1)

你可以试试下面的正则表达式,

^.*<a.*href=(['"])[^'"]*\1>[^<]*<\/a>

DEMO