0

我有一个带有标签行的文件,如下所示。我有:

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

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

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

如果标签中间有裂痕,则无法正常工作。因此,我正在寻求改进我的正则表达式的帮助,或者与非标准 xml 标签一起使用的替代方法。

4

3 回答 3

1

与其寻找 ' ' (单个空格),为什么不多次寻找任何空白?应该是'\s+'之类的东西。

于 2012-04-16T19:40:53.690 回答
0

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

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

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

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

另请注意,尽管它的名称,Pattern.MULTILINE开关不会在这里帮助你。

于 2012-04-16T19:38:51.893 回答
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());
    }
}
于 2012-04-16T20:10:15.157 回答