gpt4 book ai didi

java - 正则表达式:忽略组的顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:47 24 4
gpt4 key购买 nike

我有一段文字:

randomtext 1150,25 USD randomtext

和一个简单的正则表达式来提取不同货币的金额:

(((\d+)(,?\s?|.)(\d{1,2}))\s?(PLN|EUR|USD|CHF|GBP))

这给了我这些组:

  1. 1150,25 美元
  2. 1150,25
  3. 1150
  4. ,
  5. 25
  6. 美元

但是,数字和货币可能会互换位置:

randomtext USD 1150,25 randomtext

randomtext USD1150,25 randomtext

我应该如何改进我的正则表达式以满足该条件而不重复整个组 (AB|BA),同时保持当前分组?

最佳答案

你可以使用这种模式:

String p = "\\b (?=[\\dPEUCG])  # to jump quickly at interesting positions       \n" +
"(?= # open a lookahead \n" +
" (?> [\\d,]+ \\s* )? # perhaps the value is before \n" +
" (?<currency> PLN|EUR|USD|CHF|GBP ) # capture the currency \n" +
" (?:\\b|\\d) # a word boundary or a digit \n" +
") # close the lookahead \n" +
"(?> [B-HLNPRSU]{3} \\s* )? (?<value> \\d+(?:,\\d+)? ) ";

Pattern RegComp = Pattern.compile(p, Pattern.COMMENTS);

String s = "USD 1150,25 randomtext \n" +
"Non works randomtext 1150,25 USD randomtext\n" +
"Works randomtextUSD 1150,25 USD randomtext\n" +
"Works randomtext USD 1150,25 randomtext\n" +
"Works randomtext USD1150,25 randomtext\n" +
"Non work randomtext 1150,25 USD randomtext";

Matcher m = RegComp.matcher(s);

while( m.find() ) {
System.out.println(m.group("value") + " : " + m.group("currency"));
}

想法是先行捕获货币(即零宽度断言)。 lookahead只是断言,不消耗字符,里面的subpattern描述的是之前的一个最终值。所以货币的位置不会改变任何东西。该值是在前瞻之外捕获的。

关于 \\b (?=[\\dPEUCG]):此子模式的目标是过滤字符串中不是以数字开头或不同货币的首字母之一的单词开头的位置,而不测试整个模式。

关于java - 正则表达式:忽略组的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32287263/

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