正则表达式否定整个正则表达式

时间:2015-03-17 08:52:48

标签: java regex regex-negation

我想用正则表达式将这个String解析成组:

{4: :35B:ISIN DE000XXXXXXX DISC.Z 11.11.11 XXXX90 1234 (HSBC T R.? B.) /F:12345/R:N/W:N/C:N/S:N/G:N/A:N/F:N /XX/Any Word :16S:CONFDET :16R:SETDET :22F::SETR//TRAD :11A::FXIB//EUR :16R:AMT :19A::DEAL//EUR222, :16S:AMT :16R:AMT :19A::LOCO//EUR555 :16S:AMT :16R:AMT :19A::OTHR//EUR444 :16S:AMT :16R:AMT :19A::SETT//EUR333,33 :16S:AMT :16S:SETDET -}

我创建了这个正则表达式(:\d\d[a-zA-Z]:*(\w*\/\/)?|:\d\d:)([^:]+) 它在大多数情况下都匹配,但在这个情况下不匹配。 我想提取这样的组:

:35B: => ISIN DE000XXXXXXX DISC.Z 11.11.11 XXXX90 1234 (XXXX T R.? B.) /F:12345/R:N/W:N/C:N/S:N/G:N/A:N/F:N /XX/Any Word

:16S: => CONFDET

:16R: => SETDET

...

我预计第二组中没有':'。也许有人可以帮助我。我需要将整个Sting直到下一个:\ d \ d \ w:Block。

编辑:输入String具有键值结构。例如:35B:是键和后面的一切,直到下一个键是值(在示例的情况下,值是'ISIN DE000XXXXXXX DISC.Z 11.11.11 XXXX90 1234(XXXX T R.?B。)/ F :12345 / R:N / W:N / C:N / S:N / G:N / A:N / F:N / XX /任何字')。 我想提取输入字符串的键值对。这是我想要的一个小代码示例:

CharSequence swiftMessage = "{4: :35B:ISIN DE000XXXXXXX DISC.Z 11.11.11 XXXX90 1234 (HSBC T R.? B.) /F:12345/R:N/W:N/C:N/S:N/G:N/A:N/F:N /XX/Any Word :16S:CONFDET :16R:SETDET :22F::SETR//TRAD :11A::FXIB//EUR :16R:AMT :19A::DEAL//EUR222, :16S:AMT :16R:AMT :19A::LOCO//EUR555 :16S:AMT :16R:AMT :19A::OTHR//EUR444 :16S:AMT :16R:AMT :19A::SETT//EUR333,33 :16S:AMT :16S:SETDET -}";

Pattern pattern = Pattern.compile("(:\\d\\d([a-zA-Z]):*(\\w*//)?|:\\d\\d:)([^:]+)");
Matcher matcher = pattern.matcher(swiftMessage);

while( matcher.find() ) {
    String key = matcher.group(1);
    String value = matcher.group(4);

    System.out.println(key + "=>" + value);

}

预期输出(结构是键=>值):

:35B:=>ISIN DE000XXXXXXX DISC.Z 11.11.11 XXXX90 1234 (HSBC T R.? B.) /F:12345/R:N/W:N/C:N/S:N/G:N/A:N/F:N /XX/Any Word
:16S:=>CONFDET 
:16R:=>SETDET 
:22F::SETR//=>TRAD 
:11A::FXIB//=>EUR 
:16R:=>AMT 
:19A::DEAL//=>EUR222, 
:16S:=>AMT 
:16R:=>AMT 
:19A::LOCO//=>EUR555 
:16S:=>AMT 
:16R:=>AMT 
:19A::OTHR//=>EUR444 
:16S:=>AMT 
:16R:=>AMT 
:19A::SETT//=>EUR333,33 
:16S:=>AMT 
:16S:=>SETDET -}

在我的正则表达式中,键的值:35B:是'ISIN DE000XXXXXXX DISC.Z 11.11.11 XXXX90 1234(HSBC T R.?B。)/ F'因为我的正则表达式寻找下一个冒号。被驱逐的值应为'ISIN DE000XXXXXXX DISC.Z 11.11.11 XXXX90 1234(HSBC T R.?B。)/ F:12345 / R:N / W:N / C:N / S:N / G:N /答:N / F:N / XX /任何字'

希望现在最好理解。

1 个答案:

答案 0 :(得分:0)

您希望找到以(space):分隔的代币,然后将每个代币中的第一个:之前的部分视为关键,并将其作为值进行处理。

在这种情况下,您可以尝试使用

(?<key>(?<=\\s):\\d\\d[a-zA-Z]):(?<value>.*?)(?=\\s:|$)

将尝试

  • 找到前面有空格:\\d\\d[a-zA-Z]的{​​{1}}部分,并将其放入名为(?<=\\s)
  • 的组中
  • 找到最小值(因为key量词是不情愿的)字符集,直到找到下一个*?或字符串结尾,并将此部分放在名为\\s:的组中。

所以你的代码看起来像

value

其他方法可能只是在Pattern pattern = Pattern.compile("(?<key>(?<=\\s):\\d\\d[a-zA-Z]):(?<value>.*?)(?=\\s:|$)"); Matcher matcher = pattern.matcher(swiftMessage); while( matcher.find() ) { String key = matcher.group("key"); String value = matcher.group("value"); System.out.println(key + "=>" + value); } 上拆分,以便将您的数据分成

等部分
\\s:

然后再将{@ 1}}上的每个部分拆分,但拆分的数量有限{4: 35B:ISIN DE000XXXXXXX DISC.Z 11.11.11 XXXX90 1234 (HSBC T R.? B.) /F:12345/R:N/W:N/C:N/S:N/G:N/A:N/F:N /XX/Any Word 16S:CONFDET ... 16S:SETDET -} (因此:变为2)。

使用这种方法,您的代码可能看起来像

"foo:bar:baz:".split(":",2)