从JAVA中具有特定模式的String获取子字符串

时间:2017-08-18 13:19:09

标签: java regex string

我有以下输入:

8=FIX.4.2|9=00394|35=8|49=FIRST|8=FIX.4.2|9=00394|35=8|56=MIDDLE|10=245|8=FIX.4.2|9=00394|35=8|49=LAST|56=HEMADTS|10=024|

现在我想要以" 8 = ???"开头的字符串并以" 10 = ??? |"结束。你可以看到上面有两个以8开头并以10结尾的字符串。我为此编写了一个程序。

以下是我的代码:

public class Main {
  static Pattern r = Pattern.compile("(.*?)(8=\\w\\w\\w)[\\s\\S]*?(10=\\w\\w\\w)");

  public static void main(String[] args) {     
       String str = "8=FIX.4.2|9=00394|35=8|49=FIRST|8=FIX.4.2|9=00394|35=8|56=MIDDLE|10=245|8=FIX.4.2|9=00394|35=8|49=LAST|56=HEMADTS|10=024|";
       match(str);
  }

  public static void match(String message) { //send to OMS

        Matcher m = r.matcher(message);
        while (m.find()) {
              System.out.println(m.group());
        }
   }
}

当我刚刚运行时,我得到了错误的输出,如:

8=FIX.4.2|9=00394|35=849=FIRST`|8=FIX.4.2|9=00394|35=8|56=MIDDLE|10=245|`
8=FIX.4.2|9=00394|35=849=LAST|56=HEMADTS|10=024|

您可以在输出中看到第一个字符串。它由" 8 = ???"两次,但确切的输出需要像:

8=FIX.4.2|9=00394|35=8|56=MIDDLE|10=245|
8=FIX.4.2|9=00394|35=849=LAST|56=HEMADTS|10=024|

我还希望将不匹配的字符串分开,因为这些字符串还有进一步的工作。我怎么能得到它?因此,总产出需要如下:

Matched : 8=FIX.4.2|9=00394|35=8|56=MIDDLE|10=245|
Matched : 8=FIX.4.2|9=00394|35=849=LAST|56=HEMADTS|10=024|
UnMatched : 8=FIX.4.2|9=00394|35=849=FIRST`|

1 个答案:

答案 0 :(得分:3)

您需要使用淬火贪婪令牌来匹配2个字符串之间可能的最短窗口。这将解决第一个问题。要获得不匹配的字符串,只需将字符串拆分为模式。

使用

\b8=\w{3}(?:(?!8=\w{3})[\s\S])*?10=\w{3}\|

请参阅regex demo

<强>详情

  • \b - 字边界
  • 8= - 文字子字符串
  • \w{3} - 3个字的字符
  • (?:(?!8=\w{3})[\s\S])*? - 一个匹配任何字符([\s\S])的调和贪婪令牌,尽可能少,或多次,不会启动8=和3个字符字符模式< / LI>
  • 10= - 文字子字符串
  • \w{3} - 3个字的字符
  • \| - 文字|

Java代码:

public static Pattern r = Pattern.compile("\\b8=\\w{3}(?:(?!8=\\w{3})[\\s\\S])*?10=\\w{3}\\|");
public static void main (String[] args) throws java.lang.Exception
{
   String str = "8=FIX.4.2|9=00394|35=8|49=FIRST|8=FIX.4.2|9=00394|35=8|56=MIDDLE|10=245|8=FIX.4.2|9=00394|35=8|49=LAST|56=HEMADTS|10=024|";
   match(str);
}
public static void match(String message) { //send to OMS
    Matcher m = r.matcher(message);
    System.out.println("MATCHED:");
    while (m.find()) {
       System.out.println(m.group());
    }
    System.out.println("UNMATCHED:");
    String[] unm = r.split(message);
    for (String s: unm) {
        System.out.println(s);  
    }
}

请参阅Java demo

结果:

MATCHED:
8=FIX.4.2|9=00394|35=8|56=MIDDLE|10=245|
8=FIX.4.2|9=00394|35=8|49=LAST|56=HEMADTS|10=024|
UNMATCHED:
8=FIX.4.2|9=00394|35=8|49=FIRST|