2017-06-14 46 views
0

比方说,我有一个XML字符串<tagA>许多OCCURENCES:Java的替代正则表达式的所有出现的与另一个正则表达式

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>",但我被困在这里。

我想更换,因为这些字符中的人物有“&”,“>”,“<”的迹象,这使得该XML无效的(这让我无法治疗这种为XML)。

+2

[不要使用正则表达式解析XML(https://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why -it-is-hard-to-parse-xml-and-html-with-a-reg) – VGR

+1

在谓词中使用XPath和'starts-with'函数。 –

+1

我无法解析XML,因为它无效。 (&字符使xml无效) – Simon

回答

2

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

在搜索Group 1你会得到的TAG,在Group 2你会得到你怪异的东西(的一切,是不是一个数字)并在Group 3有数字。

有这个表达式可能在更多的情况下工作的“加强版”:(\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 </>