我的文件看起来如下,带有标记行。我有:
Pattern.compile("<(?:TIMEX TYPE|ENAMEX TYPE)=.+?>(.+?)</(?:TIMEX|ENAMEX)>");
如果两个标签都在一行上,这将获得我需要的数据。我的问题是处理以下几行:
<ENAMEX
TYPE="CITED">1</ENAMEX>
如果标签中间有分割,则无法正常工作。所以我正在寻找帮助改进我的正则表达式,或者使用非标准xml标签的替代方案。
答案 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());
}
}