2017-02-04 28 views
1

我在練習解析XML。Java正則表達式點與實際點字符(。)不匹配

我的一句話就是

<SINGER>I.O.I</SINGER> came back on <MONTH>May</MONTH> 4, <YEAR>2016</YEAR>. 

我用兩個

Pattern.compile("<[^/^>.]+>[^<^>.]+</[^>.]+>"); 

Pattern.compile("<[^/^>.]+>[^<^>\\..]+</[^>.]+>"); 

然而,正則表達式不能匹配

<SINGER>I.O.I</SINGER>

我覺得我的正則表達式,因爲這些點的行爲怪異,因爲他們可以匹配

<SINGER>I-O-I</SINGER>

我該怎麼辦?

謝謝。

+2

即使這是慣例,你要注意,這不是*有效* XML(所以它的如果你的目標是解析真正的XML),你不應該使用正則表達式來解析標記語言(XML,HTML,XHTML,* ML) – BackSlash

+0

@BackSlash爲什麼它不是有效的XML? –

+0

如果您正在處理XML,則應使用XML技術來完成此操作,例如XML解析器,XPath和XSLT。一般來說,正則表達式不足以適應XML。 – EJP

回答

2

圖案<[^/^>.]+>[^<^>.]+</[^>.]+>指:

除了 / ^ >.
  • >
  • 一個或多個字符
    1. <
    2. 一個或多個字符除了<^>.
    3. 除了 > .
    4. >

  • </
  • 一個或多個字符所以它不會匹配<SINGER>I.O.I</SINGER>

    你可能要像<[^>]+>[^<]*</[^>]+>作爲一個快速和骯髒的方式來從XML標籤提取數據。

    然後,你需要使用PatternMatcher正確:

    Pattern p = Pattern.compile("<[^>]+>([^<]*)</[^>]+>"); 
        Matcher m = p.matcher("<SINGER>I.O.I</SINGER> came back on <MONTH>May</MONTH> 4, <YEAR>2016</YEAR>."); 
        while (m.find()) { 
         System.out.println(m.group(1)); 
        } 
    

    會打印:

    I.O.I 
    May 
    2016 
    
  • +0

    看起來像OP認爲'^/^>。'意味着「除了'/'和'>'以外的所有東西。 – Tom

    +0

    這就是它,是的 – rustyx

    +0

    @Tom是的,那是我認爲的... –

    0

    如果要將正則表達式中具有特殊含義的點或其他字符設置爲普通字符,則必須使用反斜槓進行轉義。由於Java中的正則表達式是普通的Java字符串,因此您需要自行轉義反斜槓,因此您需要使用兩個反斜槓,例如\\.

    +0

    我想我是在我的第二個正則表達式中完成的。 –

    +0

    如果你看到你正在使用\\ ..這將無法正常工作 –

    +0

    不應該是正則表達式。匹配真正的點字符(。)? –