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

我最近在用 java 开发一个命令行项目,我需要通过命令进行解析。但是我在匹配这个特定命令时遇到了问题。

15.00|GR,LQ,MD "Uber"

其中金额可以是小数部分 2 或 int。我需要收集有关组的所有信息。“优步”是一个可选的描述。

这是我试过的..

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

我期望的是获得号码,由两个字符组成的用户以及可选的描述......


浮云间
浏览 131回答 3
3回答

素胚勾勒不出你

您的正则表达式分析:"ˆ([\\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 上的演示。

回首忆惘然

第一个字符是 aˆ而不是^。除此之外,您应该将第一组更改([\d]+(\.[\d]{2})?)为 get only15.00和 not 15.00|GR。完整示例如下所示:Pattern.compile("^([\\d]+(\\.[\\d]{2})?)\\|(([A-Z]{2})(,[A-Z]{2})*)\\s(\".+\")?$");

qq_花开花谢_0

有两个主要问题。该ˆ字符是重音抑扬符而不是^插入符号。您没有在正则表达式中包含方括号。一个可能的解决方案可能是这样的Pattern.compile("^\\[(?<number>[\\d]+(?>\\.[\\d]{2})?)\\|(?<codes>(?>[A-Z]{2},?)+)(?>\\s\\\"(?<comment>.+)\\\")?\\]$");该解决方案还命名了捕获组,这使得指定您希望从哪个组获取价值变得更好。https://regex101.com/r/HEboNf/2所有三个 2 字母代码都分组在一个捕获组中,您可以在代码中用逗号分隔它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java