0

我在 java 应用程序中使用了以下正则表达式。有时它可以正常工作,有时却不能。

<!-- <editable name=(\".*\")?> -->(.*)<!-- </editable> -->

有时我会在它之前/之后有空格,有时会有文本。标签内的区域也是如此。

主要问题是 name=(\".*\")?> 有时匹配的比预期的要多。我不确定这是否是显而易见的问题,只需查看此代码即可。

4

4 回答 4

5

XML 不是常规语言,HTML 或任何其他具有“嵌套”结构的语言也不是。不要试图用正则表达式解析它。

选择一个 XML 解析器

于 2009-06-26T12:02:10.237 回答
1

正如其他人指出的那样,.*与“名称”属性匹配的贪婪(点星)需要设为非贪婪(.*?)甚至更好,替换为否定字符类([^"]*),因此它不能匹配超出关闭引号无论在正则表达式的其余部分发生什么。一旦你解决了这个问题,你可能会发现你和另一个点星有同样的问题;你也需要让它不贪婪。

Pattern p = Pattern.compile(
    "<!--\\s*<editable\\s+name=\"([^\"]*)\">\\s*-->" +
    "(.*?)" +
    "<!--\\s*</editable>\\s*-->",
    Pattern.DOTALL);

我不明白你关于空格的评论的重要性。如果你说的是换行符和/或回车符,DOTALL 修饰符让点匹配那些——当然,\s也匹配它们。

我以 Java 字符串文字的形式写了这个,以避免混淆在哪里需要反斜杠以及需要多少反斜杠。在“原始”正则表达式中,每个空格简写 ( ) 中只有一个反斜杠\s*,并且不需要转义引号 ( "[^"]*")。

于 2009-06-27T13:23:42.377 回答
1

例如,如果 name 是某种标识符,我会将其替换.*为。[\w-]*

或者[^\"]*它不会捕获结束双引号。

编辑:

正如在其他帖子中提到的,您可能会考虑使用简单的 DOM 遍历、基于 XPath 或 XQuery 的评估过程,而不是简单的正则表达式。但请注意,您仍然需要在过滤过程中使用正则表达式,因为您只能通过针对正则表达式测试它们的主体来找到目标注释(因为我怀疑主体是从样本中不断判断的)。

编辑2:

可能是注释正文的前导、尾随或内部空格使您的正则表达式失败。考虑\s*在开头和结尾加上\s+类似属性的东西之前。

<!--\s*<editable\s+name=(\"[^\"]*\")?>\s*-->(.*)<!--\s*</editable>\s*-->

或者当您在基于 XML 的搜索上进行过滤时:

"\\s*<editable\\s+name=(\"[^\"]*\")?>\\s*"
"\\s*</editable>\\s*"

编辑 3:修复了两次转义。谢谢艾伦M。 _

于 2009-06-26T09:20:15.183 回答
0

默认情况下,*乘数是“贪婪的”,这意味着它尽可能匹配,同时仍然成功匹配模式。

您可以使用 *? 禁用此功能,因此请尝试:

(\".*?\")
于 2009-06-26T09:20:10.160 回答