2017-02-04 26 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

    不应该是正则表达式。匹配真正的点字符(。)? –