Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保留特定结束标记的Java正则表达式_Java_Regex - Fatal编程技术网

保留特定结束标记的Java正则表达式

保留特定结束标记的Java正则表达式,java,regex,Java,Regex,我试图编写一个正则表达式来删除除少数结束xml标记之外的所有标记 代码似乎很简单: String stringToParse = "<body><xml>some stuff</xml></body>"; Pattern pattern = Pattern.compile("</[^(a|em|li)]*?>"); Matcher matcher = pattern.matcher(stringToParse); stringToPar

我试图编写一个正则表达式来删除除少数结束xml标记之外的所有标记

代码似乎很简单:

String stringToParse = "<body><xml>some stuff</xml></body>";
Pattern pattern = Pattern.compile("</[^(a|em|li)]*?>");
Matcher matcher = pattern.matcher(stringToParse);
stringToParse = matcher.replaceAll("");
stringToParse=“一些东西”;
Pattern=Pattern.compile(“”);
Matcher Matcher=pattern.Matcher(stringToParse);
stringToParse=matcher.replaceAll(“”);
但是,当它运行时,它会跳过“xml”结束标记。它似乎跳过了编译组中有匹配字符(a | em | li)的任何标记,也就是说,如果我从“li”中删除“l”,它就会工作


我希望这将返回以下字符串:“
一些东西”
(我正在进行额外的解析以删除开头标记,但保持示例的简单性)。

您可能不应该使用正则表达式来完成此任务,但让我们看看会发生什么

您的问题是,您使用的是一个负数字符类,而在字符类中,您不能编写复杂的表达式,只能编写字符。您可以尝试消极的前瞻:

"</(?!a|em|li).*?>"
"</(?!a|em|li).*?>"
“”
但这无法正确处理许多情况:

  • 包含类似于标记的内容的注释
  • 标记为属性中的字符串
  • 以a、em或li开头但实际上是其他标记的标记
  • 大写字母
  • 等等

你也许可以解决这些问题,但是你需要考虑它是否值得,或者如果找到一个基于合适的HTML解析器的解决方案会更好。

你可能不应该使用ReGEX来完成这个任务,但是让我们看看会发生什么…… 您的问题是,您使用的是一个负数字符类,而在字符类中,您不能编写复杂的表达式,只能编写字符。您可以尝试消极的前瞻:

"</(?!a|em|li).*?>"
"</(?!a|em|li).*?>"
“”
但这无法正确处理许多情况:

  • 包含类似于标记的内容的注释
  • 标记为属性中的字符串
  • 以a、em或li开头但实际上是其他标记的标记
  • 大写字母
  • 等等

你也许可以修复这些问题,但是你需要考虑它是否值得,或者如果找到一个基于合适的HTML解析器的解决方案更好。

你不能在字符类中使用一个替换。字符类始终与单个字符匹配

您可能希望改用负向前看或向后看:

"</(?!a|em|li).*?>"
"</(?!a|em|li).*?>"
“”

不能在字符类中使用替换。字符类始终与单个字符匹配

您可能希望改用负向前看或向后看:

"</(?!a|em|li).*?>"
"</(?!a|em|li).*?>"
“”

我真的会为此使用合适的解析器(例如)。您无法使用正则表达式解析XML/HTML,因为它不是正则表达式,而且没有结束边缘的情况。我宁愿使用标准JDK(JAXP)或合适的第三方库(见上文)中提供的XML解析,并相应地配置输出


请参阅,以了解更多有关re的信息。通过regexps解析XML/HTML。

我真的会为此使用合适的解析器(例如)。您无法使用正则表达式解析XML/HTML,因为它不是正则表达式,而且没有结束边缘的情况。我宁愿使用标准JDK(JAXP)或合适的第三方库(见上文)中提供的XML解析,并相应地配置输出


请参阅,以了解更多有关re的信息。通过regexps解析XML/HTML。

请明确说明您希望stringToParse的最终值是什么,以及您得到了什么?这似乎是一些安全敏感任务的一部分。我强烈建议不要使用正则表达式,而是使用真正的解析器。即使您将变量命名为“stringToParse”,使用正则表达式也不会进行解析。请明确说明您希望stringToParse的最终值是什么,以及您得到了什么?这似乎是某些安全敏感任务的一部分。我强烈建议不要使用正则表达式,而是使用真正的解析器。即使您将变量命名为“stringToParse”,使用正则表达式也不是解析。太棒了,Mark,谢谢您的解释。我不理解角色课的这一方面。太棒了,马克,谢谢你的解释。我不理解角色类的这一方面。