我有以下输入:
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`|
最佳答案
您需要使用经过调整的贪婪 token 来匹配 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 字字符模式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|
关于java - 在 JAVA 中使用特定模式从字符串中获取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45757701/