为这种有效负载寻找正确的Java REGEX

时间:2015-04-15 18:10:49

标签: java regex

我正在尝试编写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。

3 个答案:

答案 0 :(得分:1)

"(?s).*(ST\\*214|ST\\*210).*"

在Java中,您需要启用DOTALL模式(使。匹配行终止符)。这可以通过包含(?s)修饰符来完成。你只在这个ST * 214 * 900063730~第一个字符串的特定部分匹配。

test

答案 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在评论中丢失了两个'\'字符。您可以使用代码中的正则表达式。