Java用另一个正则表达式替换正则表达式的所有出现

时间:2017-06-14 15:42:05

标签: java regex

让我们说我有一个字符串,其中xml很多出现<tagA>

String example = " (...) some xml here (...)
                    <tagA>283940</tagA>
                   (...) some xml here (...)
                    <tagA>& 9940</tagA>
                    <tagA>- 99440</tagA>
                    <tagA>< 99440</tagA>
                    <tagA>99440</tagA>
                   (...) more xml here (...) "

内容应仅包含数字,但有时它包含一个随机字符,后跟空格和数字。 我想删除不需要的字符和空格。怎么做?

到目前为止,我知道我应该寻找正则表达式"<tagA>. [0-9]*<\/tagA>",但我被困在这里。

我想要替换字符,因为在这些字符中有&#34;&amp;&#34;,&#34;&gt;&#34;,&#34;&lt;&#34;使xml无效的标志(这使我无法将其视为XML)。

1 个答案:

答案 0 :(得分:2)

您正在寻找的正则表达式是: <(\w+)>(\D{0,})(\d+)

在搜索Group 1上,您将获得TAG,Group 2您将获得奇怪的内容(所有不是数字的内容)和Group 3这是数字。

有一个&#34;增强版本&#34;这个正则表达式可能适用于更多情况:(\w{0,})(<\w+>)(\D{0,})(\d+)(\D{0,})(<\/\w+>)(\w{0,})

这将放在Group 1标记之前可能出现的任何空格中。 Group 7将处理尾随的空格。 Group 2 and 6将匹配开始标记和结束标记。 Group 3 and 5将匹配您的值之间可能存在的任何奇怪角色。 Group 4将包含您的价值。

使用String :: replaceAll,您可以通过仅打印第2,4和6组进行过滤和清理,从而完成剩下的工作。

//input data
String s = "<tagA>283940</tagA>\n" +
"                    <tagA>& 9940<</tagA>\n" +
"                    <tagA>- 99440</tagA>\n" +
"                    <tagA>< 99440</tagA>\n" +
"                    <tagA>99440</tagA>"
                + "<13243> asdfasdf </>";


    String replaced = s.replaceAll("(\\s{0,})(<\\w+>)(\\D{0,})(\\d+)(\\D{0,})(<\\/\\w+>)(\\s{0,})", "$2$4$6");
    System.out.println(replaced);

输出:<tagA>283940</tagA><tagA>9940</tagA><tagA>99440</tagA><tagA>99440</tagA><tagA>99440</tagA><13243> asdfasdf </>