有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有以下文字:

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

两个“:XXX:”标志(包括第一行)之间最多可以有10行。 我需要提取(只使用正则表达式,不使用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) 个答案

  1. # 1 楼答案

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

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

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

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

  2. # 2 楼答案

    你可以用这个正则表达式

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

    描述

    此表达式将捕获每个部分的前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
            )
    
    )