我正在尝试编写Java Regex的两个不同的有效负载:
输入有效负载1
ISA*00* *00* *ZZ*EXDO *ZZ*047336389 *150327*1007*U*00401*900063730*0*P*>~
GS*QM*EXDO*047336389*20150327*1007*900063730*X*004010~
ST*214*900063730~
B10*326GENT15173**EXDO~
L11*019*TN~
输入有效负载2
ISA*00* *00* *02*HJBT *01*047336389 *140103*1751*U*00401*000012003*0*P*>\
GS*QM*HJBT*047336389*20140103*1751*12003*X*004010\
ST*214*0001\
B10*117094*B065199*HJBT\
N1*SH*INTEVA PRODUCTS LLC-\
我有以下REGEX:
.*(ST\*214|ST\*210).*
我尝试评估此网址http://www.regexplanet.com/advanced/java/index.html
上的REGEX我看到匹配()为第一次有效负载为NO,匹配()为第二次有效负载为“是”。我正在寻找更新的REGEX,它实际上适用于这两个条件。
我的目的是验证有效负载信息,就像String contains方法一样,可以使用以下方法来实现。
payload.toString().contains('ST*214') || payload.toString().contains('ST*210').
我想在这里使用正则表达式而不是string.contains。
答案 0 :(得分:1)
"(?s).*(ST\\*214|ST\\*210).*"
在Java中,您需要启用DOTALL模式(使。匹配行终止符)。这可以通过包含(?s)修饰符来完成。你只在这个ST * 214 * 900063730~第一个字符串的特定部分匹配。
答案 1 :(得分:-1)
我认为您尝试匹配通配符'*'
,因此您应该使用反斜杠:
.*(ST\*214|ST\*210).*
或
.*ST\*(214|210).*
或
.*ST\*21(4|0).*
或
.*ST\*21[40].*
您的有效负载的换行部分或仅是一些格式化吗?
答案 2 :(得分:-1)
使用以下正则表达式: “*(ST \ * 214 | ST \ * 210)。*” 用以下代码测试了你的两个字符串:
public class RegTest {
public static void main (String[] args) {
String test1 = "ISA*00* 00 ZZEXDO *ZZ*047336389*150414*1108*U*00401*979863647*0*P*>~ GSQMEXDO*047336389*20150414*1108*979863647*X*004010~ ST*214*979863647~ B10*186143**EXDO~";
String test2 = "ISA*00* 00 *02*HJBT *01*047336389*140103*1751*U*00401*000012003*0*P*>\\GSQMHJBT*047336389*20140103*1751*12003*X*004010\\ST*214*0001\\B10*117094*B065199*HJBT\\N1*SH*INTEVA PRODUCTS LLC-\\";
if (test1.matches(".*(ST\\*214|ST\\*210).*")) {
System.out.println("String1 matches");
}
if (test2.matches(".*(ST\\*214|ST\\*210).*")) {
System.out.println("String2 matches");
}
}
}
只是小修复,regexp在评论中丢失了两个'\'字符。您可以使用代码中的正则表达式。