正则表达式不适用于Java

时间:2015-08-27 15:56:51

标签: java regex

我对服务器中收到的数据有一些预期的模式。预计会有以下两行。

¬14AAAA3170008@¶

%AAAA3170010082¶

所以,为了检查数据是否正常,我写了以下正则表达式:

(?<pacote>\\A¬\\d{2}[a-fA-F0-9]{4}\\d{7}.{2})
(?<pacote>\\A[$%][a-fA-F0-9]{4}\\d{10}.)

它在regex101.com中运行良好,但Java Pattern和Matcher并不像预期的那样理解这个正则表达式。这是我的Java代码

String data= "¬14AAAA3170008@¶%AAAA3170010082¶";
Pattern patternData = Pattern.compile( "(?<pacote>\\A¬\\d{2}[a-fA-F0-9]{4}\\d{7}.{2})", Pattern.UNICODE_CASE  );
Matcher matcherData = patternData.matcher( data );


if( matcherData .matches() ){
  System.out.println( "KNOW. DATA[" + matcherData .group( "pacote" ) + "]");

}else{
  System.out.println( "UNKNOW" );

}

它并没有像预期的那样奏效。有人能帮我弄清楚我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

您正在使用Pattern,它与整个输入相匹配。

但是,您使用的\\A仅适用于第一个输入,而您的整个输入包含连接的两个案例。

最重要的是,String test = "¬14AAAA3170008@¶%AAAA3170010082¶"; Pattern p = Pattern.compile( // | named group definition // | | actual pattern // | | | ¬ + 2 digits or $% // | | | | 4 hex alnums // | | | | | 7 to 10 digits // | | | | | | any 1 or 2 characters // | | | | | | | multiple times (2 here) "(?<pacote>((¬\\d{2}|[$%])[a-fA-F0-9]{4}\\d{7,10}.{1,2})+)" ); Matcher m = p.matcher(test); if (m.find()) { System.out.println(m.group("pacote")); } 边界匹配器意味着模式跟随输入的开始。

您可以使用以下模式来概括和匹配两者:

¬14AAAA3170008@¶%AAAA3170010082¶

<强>输出

playlist.append ( "music1.mp3" )
playlist.append ( "music2.mp3" )
playlist.append ( "music3.mp3" )