返回'字符和正则表达式java 8的换行符

问题描述

我在Java 8中遇到了一种奇怪的行为,涉及在正则表达式中使用(\ r?\ n)来解析文本文件,并在Java 8下运行IDE eclipse。

请参见regex101测试演示https://regex101.com/r/QHSsfQ/4

正则表达式对于带有IDE eclipse的Java 7正常工作。

但是由于IDE在Java 8中运行,因此无法正常工作(请参见下面的代码

有人可以帮我解决这个问题吗?

    String REGEX =
          "\\s+NAME.*" + "\\r?\\n"
          + "INFO-\\d{1,2}\\s+(?<name>[$\\w]+).*" + "\\r?\\n"
          + ".*" + "\\r?\\n"
            + ".*VERAT2.*" + "\\r?\\n"
            + "\\s+\\w+\\s+(?<verat2>\\w+).*"  
.......
.......

  Matcher matcher = Pattern.compile( REGEX ).matcher( data );
          
                        if( matcher.find() )
                        {
                      
    System.out.println("LEVELINFO=DATA=" + matcher.group("name") + " &&NAME=" + matcher.group("name") +" &&VERAT2="+ matcher.group("verat2")+"\n"); 
                        }
                    }
                            sc.close();

示例文本文件如下所示:

DATA              NAME                    MAC1  
INFO-0            EQUIP                   Q10    
 
                  VL      VER     VERAT2     
                          V22     V22       
 
                

谢谢

解决方法

替代正则表达式:

String regexName = "^DATA\\s+NAME\\s+.*?^\\S+\\s+(?<name>\\S+)";
String regexVerat2 = "\\s+VER\\s+VERAT2\\s+.*?^\\s+\\S+\\s+(?<verat2>\\S+)";
String regex = String.format("%s.*?%s",regexName,regexVerat2);
Matcher matcher = Pattern.compile(regex,Pattern.MULTILINE|Pattern.DOTALL).matcher(input);

上下文中的正则表达式:

public static void main(String[] args) {
    String input =
              "DATA              NAME                                  MAC1  MAC2\n"
            + "INFO-0            EQUIP                                 Q10    Q13\n"
            + " \n"
            + "                  VL                    VER     VERAT2     MAP\n"
            + "                                        V22     V22       SELF100\n"
            + " \n"
            + "                  CMD1 CMD2       CMD3     CMD4     CMD4  \n"
            + "                  NO    44        FAL      BYTE\n";

    String regexName = "^DATA\\s+NAME\\s+.*?^\\S+\\s+(?<name>\\S+)";
    String regexVerat2 = "\\s+VER\\s+VERAT2\\s+.*?^\\s+\\S+\\s+(?<verat2>\\S+)";
    String regex = String.format("%s.*?%s",regexVerat2);
    Matcher matcher = Pattern.compile(regex,Pattern.MULTILINE|Pattern.DOTALL).matcher(input);

    while(matcher.find()) {
        System.out.println("Name: " + matcher.group("name"));
        System.out.println("Verat2 : " + matcher.group("verat2"));
    }
}

输出:

Name: EQUIP
Verat2 : V22