如何在Java RegEx中按组匹配转义字符

时间:2019-05-24 21:17:38

标签: java regex

我最近正在使用Java进行命令行项目,并且需要通过命令进行解析。但是我在匹配此特定命令时遇到问题。

15.00|GR,LQ,MD "Uber"

其中的金额可以是两位小数或整数。我需要收集有关组的所有信息。 “ Uber”是可选描述。

这是我尝试过的。

Pattern.compile("ˆ([\\d]+(\\.[\\d]{2})?\\|([A-Z]{2}){1})(,[A-Z]{2})*\\s(\\\".+\\\")?$");

我希望获得数字,两个字符组成的用户以及描述(可选)。

3 个答案:

答案 0 :(得分:2)

第一个字符是ˆ,而不是^。除此之外,您应该将第一个组更改为([\d]+(\.[\d]{2})?),以仅获得15.00而不是15.00|GR

完整的示例如下:

Pattern.compile("^([\\d]+(\\.[\\d]{2})?)\\|(([A-Z]{2})(,[A-Z]{2})*)\\s(\".+\")?$");

答案 1 :(得分:2)

有两个主要问题。

  • def func(list_a): dict_a = {"duck":0,"goose":1} return [dict_a.get(item,item) for item in list_a] 字符是重音符,而不是ˆ插入符号。
  • 您不在正则表达式中包括方括号。

可能的解决方案可能是这样

^

此解决方案还命名了捕获组,这使得更好地指定要从中获取价值的组。 https://regex101.com/r/HEboNf/2

2个字母代码中的所有三个都分组在一个捕获组中,您可以在逗号中的代码中将它们拆分。

答案 2 :(得分:2)

您的正则表达式已分析:

"ˆ([\\d]+(\\.[\\d]{2})?\\|([A-Z]{2}){1})(,[A-Z]{2})*\\s(\\\".+\\\")?$"

首先,让我们将Java字符串文字转义为实际的正则表达式字符串:

ˆ([\d]+(\.[\d]{2})?\|([A-Z]{2}){1})(,[A-Z]{2})*\s(\".+\")?$

现在让我们将其分开:

ˆ                  Incorrect character 'ˆ', should be '^'
                   Match start of input, but your input starts with '['
(                  
  [\d]+            The '[]' is superfluous, use '\d+'
  (\.[\d]{2})?     Don't capture this, use '(?:X)?'
  \|
  ([A-Z]{2}){1}    The '{1}` is superfluous, and don't capture just this
)                  You're capturing too much. Move back to before '\|'
(,[A-Z]{2})*       Will only capture last ',XX'.
                   Use a capture group around all the letters, then split that on ','
\s
(\".+\")?          No need to escape '"', and only capture the content
$                  Match end of input, but your input ends with ']'

因此,将其清理为:

^\[
(
  \d+
  (?:\.[\d]{2})?
)
\|
(
  [A-Z]{2}
  (?:,[A-Z]{2})*
)
\s
(?:"(.+)")?
\]$

重新加入:

^\[(\d+(?:\.[\d]{2})?)\|([A-Z]{2}(?:,[A-Z]{2})*)\s(?:"(.+)")?\]$

使用输入[15.00|GR,LQ,MD "Uber"]将捕获:

  1. 15.00-完整号码
  2. GR,LQ,MD-使用split(",")获取数组{ "GR", "LQ", "MD" }
  3. Uber-仅带引号的文本

请参阅regex101.com上的Demo