java - 正则表达式跨越两行,仅在单独的行上匹配

标签 java regex

我有一个 .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))

RegEx Demo

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/

相关文章:

java - 使用httpclient登录Xing

java - CheckStyle 规则或类似的规则以防止非原始数据类型上的 == ?

java - 如何在 Java Swing 中将文本文件读入 jtextarea

mysql - mysql中相同字符3次条件

php - 在php中使用preg_replace删除php中的空格

PHP preg_replace : remove punctuation from beginning and end of string

剩余大量内存时出现 java.lang.OutOfMemoryError (94GB/200GB Xmx)

java - 如何让媒体播放器自动切换到下一轨道?

.net - 使用 REGEX 查找 HTML ListItem (.NET) 的内容

Java : Getting effected sentence in Google-diff-match-patch