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

标签 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`|

最佳答案

您需要使用经过调整的贪婪 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/

相关文章:

java - java中正则表达式中的可选元素

regex - 如何使用正则表达式和R正确编辑字符串?

c++ - 使用后缀数组和 LCP(-LR) 实现字符串模式匹配

c++ - 使用 map (HashMap)、字符串和日期的最佳 C++ API

javascript - 使用正则表达式增加字符串中的数字

string - Lua - 获取 indexOf 字符串

java - bundle 失去值(value)

java - 自定义 BlockJUnit4ClassRunner,运行测试套件设置次数

java - Vaadin:将值从主页传递到窗口页面

java - org.eclipse.ui.PlatformUI 类在哪里?