从行中提取文本所需的正则表达式帮助

时间:2013-06-23 09:49:27

标签: java regex

我有以下文字:

: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

非常感谢任何帮助。

感谢。

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式

(?<=:.{3}:)(.*?(\\r?\\n)){1,4}

答案 1 :(得分:1)

描述

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

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

enter image description here

扩展

  • ^:[^:]*:匹配分节符
  • .*?匹配与分节符相同的行上的文字
  • (?此捕获组将匹配整个行,而不是分节符
    • ^匹配行的开头
    • (?:(?!^:[^:]*:|[\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
        )

)

答案 2 :(得分:0)

开始时可能是正则表达式:

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

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

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