我有以下输入:
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`|
答案 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|