用于查找没有嵌套标签的标签的正则表达式

时间:2010-01-06 16:50:34

标签: regex

我正在尝试编写一个正则表达式,这将有助于在HTML代码中查找非翻译文本。

翻译文本意味着他们正在经历特殊标记:或通过构建:$ {...}

实施例。非翻译:

<h1>Hello</h1>

翻译的文本是:

<h1><fmt:message key="hello" /></h1>
<button>${expression}</button>

我写了以下表达式:

\<(\w+[^>])(?:.*)\>([^\s]+?)\</\1\>

找到正确的字符串,如:

<p>text<p>

正确跳过

<a><fmt:message key="common.delete" /></a>

但也抓住了:

<li><p><fmt:message key="common.delete" /></p></li>

我无法弄清楚如何在此表达式中添加$ {...}字符串的异常 有人能帮助我吗?

5 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要确保“标记”中的数据不包含fmt:messsage${....}

您可以使用与.结合使用的否定前瞻来断言.捕获的字符不属于以下情况之一:

/<(\w+)[^>]*>(?:(?!<fmt:message|\$\{|<\/\1>).)*<\/\1>/i

如果您想避免在代码中捕获任何“代码”,则可以忽略<fmt:message部分,只使用[^<]代替. - 仅匹配非{ {1}}

<

从评论中添加如果您还要排除“空”标记,请添加另一个负面预测 - 这次/<(\w+)[^>]*>(?:(?!\$\{)[^<])*<\/\1>/i - 确保标记内的内容不为空或仅包含空格:

(?!\s*<)

答案 1 :(得分:1)

如果格式很简单,可以试试这个:

<(\w+)>(?:(?!<fmt:message).)+</\1>

答案 2 :(得分:0)

我已经成功使用了这样一个简单的,

<([^>]+)[^>]*>([^<]*)</\1>

当然,如果有任何带有'&lt;'的CDATA在那些它不会那么好的工作。但是对于简单的XML应该没问题。

答案 3 :(得分:0)

重写为更正式的问题:

你能匹配吗

aba

但不是

aca

没有抓住

abcba

FSM:

Start->A->B->A->Terminate

插入abcba并运行它

Start is ready for input. 
a -> MATCH, transition to A
b -> MATCH, transition to B
c -> FAIL, return fail.

答案 4 :(得分:0)

另见

https://blog.codinghorror.com/parsing-html-the-cthulhu-way/

有关使用正则表达式解析html的讨论

执行摘要:不要