我最近正在使用Java进行命令行项目,并且需要通过命令进行解析。但是我在匹配此特定命令时遇到问题。
15.00|GR,LQ,MD "Uber"
其中的金额可以是两位小数或整数。我需要收集有关组的所有信息。 “ Uber”是可选描述。
这是我尝试过的。
Pattern.compile("ˆ([\\d]+(\\.[\\d]{2})?\\|([A-Z]{2}){1})(,[A-Z]{2})*\\s(\\\".+\\\")?$");
我希望获得数字,两个字符组成的用户以及描述(可选)。
答案 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"]
将捕获:
15.00
-完整号码GR,LQ,MD
-使用split(",")
获取数组{ "GR", "LQ", "MD" }
Uber
-仅带引号的文本请参阅regex101.com上的Demo。