我对服务器中收到的数据有一些预期的模式。预计会有以下两行。
¬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" );
}
它并没有像预期的那样奏效。有人能帮我弄清楚我在做什么错吗?
答案 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" )