gpt4 book ai didi

java - 在 JAVA 中使用特定模式从字符串中获取子字符串

转载 作者:行者123 更新时间:2023-11-29 04:27:05 28 4
gpt4 key购买 nike

我有以下输入:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com