为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2022-12-15 15:57:03
我最近在用 java 开发一个命令行项目,我需要通过命令进行解析。但是我在匹配这个特定命令时遇到了问题。15.00|GR,LQ,MD "Uber"其中金额可以是小数部分 2 或 int。我需要收集有关组的所有信息。“优步”是一个可选的描述。这是我试过的..Pattern.compile("ˆ([\\d]+(\\.[\\d]{2})?\\|([A-Z]{2}){1})(,[A-Z]{2})*\\s(\\\".+\\\")?$");我期望的是获得号码,由两个字符组成的用户以及可选的描述......
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

您的正则表达式分析:


"ˆ([\\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 上的演示。


查看完整回答
反对 回复 2022-12-15
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

第一个字符是 aˆ而不是^。除此之外,您应该将第一组更改([\d]+(\.[\d]{2})?)为 get only15.00和 not 15.00|GR

完整示例如下所示:

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


查看完整回答
反对 回复 2022-12-15
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

有两个主要问题。

  • ˆ字符是重音抑扬符而不是^插入符号。

  • 您没有在正则表达式中包含方括号。

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

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

该解决方案还命名了捕获组,这使得指定您希望从哪个组获取价值变得更好。https://regex101.com/r/HEboNf/2

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


查看完整回答
反对 回复 2022-12-15
  • 3 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号