我有一个包含一些HTML代码的字符串,例如:
This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em>
我需要从每个HTML标签中删除id
属性,但我没有使用正则表达式的经验,所以我在互联网上搜索并且我写了这个模式:[\s]+id=\".*\"
< / p>
不幸的是,它没有按照我的预期运作。事实上,我希望正则表达式会捕获id="
后跟任何重复任何次数的字符,并以最近的双引号终止;实际上在这个例子中我期望抓住id="c1-id-8"
和id="c1-id-9"
。
但是该模式返回了子串id="c1-id-8">some</strong> <em id="c1-id-9"
,它找到了第一次出现的id="
和最后一次出现的双引号字符。
你能告诉我我的模式有什么问题以及如何解决它吗? 非常感谢你
答案 0 :(得分:10)
正则表达式中的量词.*
是贪婪(意味着它尽可能匹配)。为了满足最低要求,您可以使用/\s+id=\"[^\"]*\"/
之类的内容。括号[]
表示一个字符类。因此它会匹配括号内的所有内容。角色类开头的克拉[^]
是否定的,这意味着它将匹配所有除了括号中指定的内容。
另一种方法是将.*
量词变为懒惰,方法是将其更改为.*?
,尽可能少地匹配。
答案 1 :(得分:3)
在.*
中,星号是一个贪婪的量词,并且尽可能多地匹配字符,所以它只会在它找到的最后"
处停止。
你可以使用".*?"
使其变得懒惰,或者(更好的IMO),使用"[^"]*"
来明确匹配:
" # match a quote
[^"]* # match any number of characters except quotes
" # match a quote
如果从字符串构建正则表达式,您可能仍需要转义引号;否则这是没有必要的,因为引号在正则表达式中不是特殊字符。
答案 2 :(得分:1)
解析器是一般情况下的最佳解决方案,但它们需要时间来编写。有些情况下写一个会比解析器节省更多的时间;或许这是一个时间。
你想要的是非贪婪的比赛或更精确的比赛。 /[\s]+id=\".?\"/会做到这一点,但[\ s] + id = \“[^”] \“会更快。
请注意,考虑到转义引号字符的可能性的完整正则表达式允许使用单引号而不是双引号,并且允许完全没有引号会更加复杂。那时你真的想要一个解析器。
答案 3 :(得分:1)
示例使用grep :(但重点是表达式)
kent$ echo 'This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em>'|grep -oP '(?<= id=")[^"]*(?=">)'
c1-id-8
c1-id-9
答案 4 :(得分:0)
如果您知道id
总是7个字符,则可以执行此操作。
/\sid=".{7}"/g
所以..
var a = 'This is <strong id="c1-id-8">some</strong> <em id="c1-id-9">text</em>';
var b = a.replace(/\sid=".{7}"/g, '');
document.write(b);
示例: http://jsfiddle.net/jasongennaro/XPMze/
检查检查员以查看id
已移除。