我有一个 .rtf
文件,其中有很多粗体标题。我正在 try catch 两个粗体标题之间的数据。但是,用于表示某些内容为粗体的标签与文本的两端完全相同。
所以我试图找到一种模式来捕获下一个最近的行(以及之间的所有内容)而不是同一行上的粗体标记。我正在使用 Java。
示例文本:
\par }{\b\f1\fs24\ul\insrsid14762702 Data}{\insrsid14762702 \tab \tab }{\b\f1\fs24
\par Start:\tab 2015-01-14 10:56:25
\par Duration:\tab 22:40:23
\par Positions:\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm
\par Sensor Position(s):\tab -10.0, 5.0 cm
\par Depth:\tab N/A
\par
\par }{\b\f1\fs24
\par }{\b\f1\fs24\ul\insrsid14762702 History}{\insrsid14762702
\par Other
{\b\f1\fs24\ul\insrsid14762702
我目前使用的:
((\\\\b\\\\f1\\\\fs24.+?\\{\\\\b\\\\f1\\\\fs24))
整个 Java 行是:
Pattern pattern = Pattern.compile("((\\\\b\\\\f1\\\\fs24.+?\\{\\\\b\\\\f1\\\\fs24))",Pattern.DOTALL);
这给了我:
\par }{\b\f1\fs24\ul\insrsid14762702 Data}{\insrsid14762702 \tab \tab }{\b\f1\fs24
\par }{\b\f1\fs24
\par }{\b\f1\fs24
{\b\f1\fs24\ul\insrsid14762702 History}{\insrsid14762702
\par Other
{\b\f1\fs24
预期输出是:
\par }{\b\f1\fs24\ul\insrsid14762702 Data}{\insrsid14762702 \tab \tab }{\b\f1\fs24
\par Start:\tab 2015-01-14 10:56:25
\par Duration:\tab 22:40:23
\par Positions:\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm
\par Sensor Position(s):\tab -10.0, 5.0 cm
\par Depth:\tab N/A
\par
\par }{\b\f1\fs24
还有:
\par }{\b\f1\fs24
\par }{\b\f1\fs24
还有:
\par }{\b\f1\fs24\ul\insrsid14762702 History}{\insrsid14762702
\par Other
{\b\f1\fs24\ul\insrsid14762702
最佳答案
您可以为此使用 2 个捕获组。一个用于开始标记和文本直到结束标记(不应位于同一行)。您需要先行查找才能匹配重叠的匹配项。第二个捕获组将位于前瞻内。
您可以使用正则表达式:
([^\n]*\Q{\b\f1\fs24\E[^\n]*\n.*?)(?=([^\n]*\Q{\b\f1\fs24\E))
PS:注意使用Pattern.quote
以避免过度转义。
代码:
String text = "\\par }{\\b\\f1\\fs24\\ul\\insrsid14762702 Data}{\\insrsid14762702 \\tab \\tab }{\\b\\f1\\fs24\n\\par Start:\\tab 2015-01-14 10:56:25\n\\par Duration:\\tab 22:40:23\n\\par Positions:\\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm\n\\par Sensor Position(s):\\tab -10.0, 5.0 cm\n\\par Depth:\\tab N/A\n\\par \n\\par }{\\b\\f1\\fs24\n\\par }{\\b\\f1\\fs24\\ul\\insrsid14762702 History}{\\insrsid14762702 \n\\par Other \n{\\b\\f1\\fs24\\ul\\insrsid14762702";
String tag = Pattern.quote("{\\b\\f1\\fs24");
Pattern p = Pattern.compile( "([^\n]*" + tag + "[^\n]*\n.*?)(?=([^\n]*" + tag + "))",
Pattern.DOTALL );
Matcher m = p.matcher( text );
List<String> matches = new ArrayList<>();
while(m.find()) {
matches.add(m.group(1) + m.group(2));
}
for (String s: matches)
System.err.println(s + "\n");
输出:
\par }{\b\f1\fs24\ul\insrsid14762702 Data}{\insrsid14762702 \tab \tab }{\b\f1\fs24
\par Start:\tab 2015-01-14 10:56:25
\par Duration:\tab 22:40:23
\par Positions:\tab 3.0, 5.0, 7.0, 9.0, 15.0, 17.0 cm
\par Sensor Position(s):\tab -10.0, 5.0 cm
\par Depth:\tab N/A
\par
\par }{\b\f1\fs24
\par }{\b\f1\fs24
\par }{\b\f1\fs24
\par }{\b\f1\fs24\ul\insrsid14762702 History}{\insrsid14762702
\par Other
{\b\f1\fs24
关于java - 正则表达式跨越两行,仅在单独的行上匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675245/