我需要匹配所有这些开始标签:
<p>
<a href="foo">
但不是这些:
<br />
<hr class="foo" />
我想出了这个,想确保我做对了。 我只是捕获az
。
<([a-z]+) *[^/]*?>
我相信它说:
- 找到一个小于,然后
- 查找(并捕获)az一次或多次,然后
- 找到零个或多个空格,然后
- 找到零个或更多次的字符,贪婪的(
/
除外),然后 - 寻找大于
我有那个权利吗? 更重要的是,您怎么看?
#1楼
<\s*(\w+)[^/>]*>
零件说明:
<
:起始字符
\\s*
:标记名称前可能有空格(难看,但可能)。
(\\w+)
:标签可以包含字母和数字(h1)。 好吧, \\w
也匹配“ _”,但是我猜并没有伤害。 如果好奇,请改用([a-zA-Z0-9] +)。
[^/>]*
: >
和/
之前的任何内容,直到关闭>
>
:关闭>
无关
对于那些低估正则表达式的人来说,它们仅与正则语言一样强大:
正 BA BAÑn的不规整,甚至不上下文无关,可以与匹配^(a+)b\\1b\\1$
反引用FTW !
#2楼
中国古代的战略家,一般哲学家孙子说:
据说,如果您认识自己的敌人并认识自己,那么您就可以赢得一百场战斗,而不会遭受任何损失。 如果您只了解自己而不是对手,那么您可能会赢或输。 如果您既不认识自己,也不认识敌人,那么您将永远危害自己。
在这种情况下,您的敌人是HTML,而您本人或正则表达式。 您甚至可能是使用不规则正则表达式的Perl。 懂HTML。 认识你自己。
我编写了一个描述HTML本质的句。
HTML has
complexity exceeding
regular language.
我还撰写了一个hai句,描述了Perl中正则表达式的性质。
The regex you seek
is defined within the phrase
<([a-zA-Z]+)(?:[^>]*[^/]*)?>
#3楼
的确,在编程时,处理HTML时通常最好使用专用的解析器和API而不是正则表达式,尤其是在精度至关重要的情况下(例如,如果处理可能会带来安全隐患)。 但是,我不认为教条主义的观点是XML样式的标记永远不应使用正则表达式处理。 在某些情况下,正则表达式是完成这项工作的理想工具,例如,在文本编辑器中进行一次性编辑,修复损坏的XML文件或处理看起来像但不完全是XML的文件格式时。 有一些问题需要注意,但并非不可克服,甚至不一定是相关的。
在我刚刚提到的情况下,像<([^>"']|"[^"]*"|'[^']*')*>
这样的简单正则表达式通常就足够了。 考虑到所有因素,这是一个幼稚的解决方案,但是它确实允许属性值中使用未编码的>
符号。 如果要查找table
标记,则可以将其修改为</?table\\b([^>"']|"[^"]*"|'[^']*')*>
。
只是为了大致了解“正则”的HTML正则表达式,以下代码在模拟真实浏览器行为和HTML5解析算法方面做得相当不错:
</?([A-Za-z][^\s>/]*)(?:=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)|[^>])*(?:>|$)
以下内容符合XML标记的相当严格的定义(尽管它不能解决XML名称中允许的完整Unicode字符集):
<(?:([_:A-Z][-.:\w]*)(?:\s+[_:A-Z][-.:\w]*\s*=\s*(?:"[^"]*"|'[^']*'))*\s*/?|/([_:A-Z][-.:\w]*)\s*)>
当然,这些并不能说明周围的环境和一些极端情况,但是即使您确实愿意,也可以处理此类事情(例如,通过在另一个正则表达式的匹配项之间进行搜索)。
最终,即使是正则表达式,也要使用最合适的工具来完成工作。
#4楼
如果您只是想查找这些标签(没有解析的野心),请尝试以下正则表达式:
/<[^/]*?>/g
我在30秒内写下了它,并在这里进行了测试: http : //gskinner.com/RegExr/
它与您提到的标签类型匹配,而忽略了您想忽略的标签类型。
#5楼
您想要第一个>
而不以/
开头。 在这里查看有关如何执行此操作的详细信息。 这被称为否定性回溯。
但是,该示例的简单实现最终将在此示例文档中匹配<bar/></foo>
<foo><bar/></foo>
您能否提供更多有关您要解决的问题的信息? 您是否以编程方式遍历标签?
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3139160