正则表达式帮助或替代方案

时间:2012-04-16 19:36:00

标签: java

我的文件看起来如下,带有标记行。我有:

Pattern.compile("<(?:TIMEX TYPE|ENAMEX TYPE)=.+?>(.+?)</(?:TIMEX|ENAMEX)>");

如果两个标签都在一行上,这将获得我需要的数据。我的问题是处理以下几行:

<ENAMEX
TYPE="CITED">1</ENAMEX>

如果标签中间有分割,则无法正常工作。所以我正在寻找帮助改进我的正则表达式,或者使用非标准xml标签的替代方案。

3 个答案:

答案 0 :(得分:1)

为什么不寻找任何空格,而不是寻找''(单个空格)?应该是'\ s +'。

答案 1 :(得分:0)

您需要Pattern.DOTALL开关,匹配空白("\\s+"),而不是文字空间:

Pattern.compile("<(?:TIMEX\\s+TYPE|ENAMEX\\s+TYPE)=.+?>(.+?)</(?:TIMEX|ENAMEX)>", Pattern.DOTALL);

此开关的javadoc摘录解释了DOTALL开关:

  

在dotall模式下,表达式。匹配任何字符,包括行终止符。

另请注意,尽管名称如此,Pattern.MULTILINE开关将不会为您提供帮助。

答案 2 :(得分:0)

通过示例给你一个替代方案。在模式匹配之前进行搜索替换可以帮助您。

    final static String NEWLINE = "\n";
    final static String SPACE = " ";

public static void main(String[] args) {

            String s = "<ENAMEX\n TYPE=\"CITED\">1</ENAMEX>";

    Pattern pattern = Pattern.compile("<(?:TIMEX TYPE|ENAMEX TYPE)=.+?>(.+?)</(?:TIMEX|ENAMEX)>");

            s = s.replaceAll(NEWLINE, SPACE);

            Matcher matcher = pattern.matcher(s);

    while (matcher.find()) {
        System.out.println("Start index: " + matcher.start());
        System.out.println("End index: " + matcher.end());
    }
}