正则表达式否定整个正则表达式
Regular Expression negate whole regex
我想用正则表达式将这个字符串解析成组:
{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.
编辑:输入字符串具有键值结构。例如 :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')。
我想提取输入字符串的键值对。这是我想要的一个小代码示例:
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/A:N/F:N /XX/Any Word'
希望现在能更好地理解。
您似乎想要查找由 (space):
分隔的标记,然后将每个标记中第一个 :
之前的部分视为键,其余部分作为值。
在这种情况下,您可以尝试
(?<key>(?<=\s):\d\d[a-zA-Z]):(?<value>.*?)(?=\s:|$)
这将尝试
- 找到
:\d\d[a-zA-Z]
前面有 space (?<=\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:
以获取像
这样的部分的数据
{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)
变为 ["foo", "bar:baz"]
)。
使用这种方法,您的代码可以看起来像
for (String token : swiftMessage.toString().split("\s:")){
//System.out.println(token);
//lets ignore first `{4:` part
//maybe like this
if (token.length()<=3) continue;
String[] key_value = token.split(":",2);
System.out.println(":"+key_value[0]+"=>"+key_value[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 :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.
编辑:输入字符串具有键值结构。例如 :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')。 我想提取输入字符串的键值对。这是我想要的一个小代码示例:
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/A:N/F:N /XX/Any Word'
希望现在能更好地理解。
您似乎想要查找由 (space):
分隔的标记,然后将每个标记中第一个 :
之前的部分视为键,其余部分作为值。
在这种情况下,您可以尝试
(?<key>(?<=\s):\d\d[a-zA-Z]):(?<value>.*?)(?=\s:|$)
这将尝试
- 找到
:\d\d[a-zA-Z]
前面有 space(?<=\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:
以获取像
{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)
变为 ["foo", "bar:baz"]
)。
使用这种方法,您的代码可以看起来像
for (String token : swiftMessage.toString().split("\s:")){
//System.out.println(token);
//lets ignore first `{4:` part
//maybe like this
if (token.length()<=3) continue;
String[] key_value = token.split(":",2);
System.out.println(":"+key_value[0]+"=>"+key_value[1]);
}