我有一个带有标签行的文件,如下所示。我有:
Pattern.compile("<(?:TIMEX TYPE|ENAMEX TYPE)=.+?>(.+?)</(?:TIMEX|ENAMEX)>");
如果两个标签都在一行上,这将获得我需要的数据。我的问题是处理以下几行:
<ENAMEX
TYPE="CITED">1</ENAMEX>
如果标签中间有裂痕,则无法正常工作。因此,我正在寻求改进我的正则表达式的帮助,或者与非标准 xml 标签一起使用的替代方法。
我有一个带有标签行的文件,如下所示。我有:
Pattern.compile("<(?:TIMEX TYPE|ENAMEX TYPE)=.+?>(.+?)</(?:TIMEX|ENAMEX)>");
如果两个标签都在一行上,这将获得我需要的数据。我的问题是处理以下几行:
<ENAMEX
TYPE="CITED">1</ENAMEX>
如果标签中间有裂痕,则无法正常工作。因此,我正在寻求改进我的正则表达式的帮助,或者与非标准 xml 标签一起使用的替代方法。
与其寻找 ' ' (单个空格),为什么不多次寻找任何空白?应该是'\s+'之类的东西。
您需要Pattern.DOTALL
开关和空白 ( ) 的匹配项"\\s+"
,而不是文字空间:
Pattern.compile("<(?:TIMEX\\s+TYPE|ENAMEX\\s+TYPE)=.+?>(.+?)</(?:TIMEX|ENAMEX)>", Pattern.DOTALL);
此开关的 javadoc 摘录解释了该DOTALL
开关:
在 dotall 模式下,表达式 . 匹配任何字符,包括行终止符。
另请注意,尽管它的名称,Pattern.MULTILINE
开关不会在这里帮助你。
只是举例给你一个替代方案。模式匹配之前的搜索替换可以帮助您。
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());
}
}