0

我有以下文字:

:10A: <any characters here>\r\n
<any characters here>\r\n
<any characters here>\r\n
.
.
.
:11A: or :12P:

两个“:XXX:”符号之间最多可以有 10 行(包括第一行)。我需要提取(仅使用 REGEX,不使用 Java 方法)前一到四行(包括第一行,没有“:10A:”)。

示例 1:

:10A: Line number 1\r\n
Line number 2\r\n
Line number 3\r\n
Line number 4\r\n
Line number 5\r\n
Line number 6\r\n
:11A:

将提取:

Line number 1\r\n
Line number 2\r\n
Line number 3\r\n
Line number 4\r\n

示例 2:

:10A: Line number 1\r\n
Line number 2\r\n
:12P:

将提取:

Line number 1\r\n
Line number 2\r\n

任何帮助将不胜感激。

谢谢。

4

3 回答 3

1

你可以使用这个正则表达式

(?<=:.{3}:)(.*?(\\r?\\n)){1,4}
于 2013-06-23T10:42:28.363 回答
1

描述

此表达式将捕获每个部分的前 4 行文本。

^:[^:]*:(.*?(?:^(?:(?!^:[^:]*:|[\r\n]|\Z).)*[\r\n\Z]*){3})

在此处输入图像描述

展开

  • ^:[^:]*:匹配分节符
  • .*? 匹配与分节符在同一行的文本行
  • (?此捕获组将匹配不是分节符的整行
    • ^匹配行首
    • (?:(?!^:[^:]*:|[\r\n]|\Z).)*匹配行上的所有字符,前提是它们不是节标题、换行符或字符串的结尾
    • [\r\n\Z]*匹配任意数量的换行符或字符串结尾
    • ){3}尝试匹配其中三行。请注意,内部条件是自动限制的,并且会阻止捕获比部分可能包含的更多行。

Java 代码示例:

输入文本

:10A: Line number 1
Line number 2
Line number 3
Line number 4
Line number 5
Line number 6
:11A:Line number 1
Line number 2
Line number 3
Line number 4
:10A: Line number 1
Line number 2
:12P:Line number 1
Line number 2

代码

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "source string to match with pattern";
  Pattern re = Pattern.compile("^:[^:]*:(.*?(?:^(?:(?!^:[^:]*:|[\r\n]|\Z).)*[\r\n\Z]*){3})",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
  Matcher m = re.matcher(sourcestring);
  int mIdx = 0;
    while (m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
      }
      mIdx++;
    }
  }
}

匹配 这仅显示捕获组 1。捕获组 0 是整个匹配的字符串

$matches Array:
(
   [1] => Array
        (
            [0] =>  Line number 1
Line number 2
Line number 3
Line number 4

            [1] => Line number 1
Line number 2
Line number 3
Line number 4

            [2] =>  Line number 1
Line number 2

            [3] => Line number 1
Line number 2
        )

)
于 2013-06-24T01:44:32.830 回答
0

也许一个正则表达式开始:

:(?:.*?):((?:.*?[\r\n]){1,4})(?:.*?):(?:.*?):

第一个匹配组将返回最多四行文本。

重要提示:您必须打开 Java 中的“dotall”选项或类似选项( Perl 或 .NET 中Pattern.compile(pStr, Pattern.DOTALL)的单行模式),否则正则表达式将无法工作,因为您正在处理多行数据./.../sRegexOptions.Singleline

于 2013-06-23T10:21:06.703 回答