Regex -查询高效和更短的匹配方式,但跳过捕获组输出中的可选字符(空格)

llycmphe  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(100)

我最近学习了捕获组和非捕获组。我需要匹配,但从输出跳过一个单一的空格字符的文本。
经过3次尝试,我从下面的Stack Overflow帖子中得到了提示,并修改了我的理解,解决了问题。Regular expression to skip character in capture group
我只想知道是否有其他方法比我做的更有效/更短。
--数据开始--
TRA-1728(CS-02)中灰褐色/白色
Be Here Now
TRA-1723(CS-02)白色冰/炭石板
--数据结束--
--现有代码开始--([A-Z]{2,}-\d+?(?:([^)]+))?)\s?(?:\n)?([A-Za-z\s]+)/\s+([^\n]+)--现有代码结束--
--现有输出详细信息开始--
匹配1:TRA-1728(CS-02)中等灰褐色/白色
组1:TRA-1728(CS-02)
第2组:中等灰褐色
第3组:白色
匹配2:TRA-1723(CS-02)白色冰/炭石板
组1:TRA-1723(CS-02)
第2组:白色冰
第三组:木炭石板
--现有输出详细信息结束--
--Problem Statement Start--如果空格在下面的代码中,但我无法将其删除,则我能够进行匹配(即,单空格)的输出。
([A-Z]{2,}-\d+(?:)?\?(?:([^)]+))?)\s?(?:\n)?([A-Za-z\s]+)/\s+([^\n]+)
在上面的“现有输出详细信息”中,匹配2很好,但匹配1的组1包含需要排除的空间
我也尝试了下面的代码,但似乎我对非捕获组的理解仍然缺乏
([A-Z]{2,}-\d+(?:)?(?:([^)]+))?)\s?(?:\n)?([A-Za-z\s]+)/\s+([^\n]+)

**最后,下面的代码完成了,但现在组的数量上升到5

(([A-Z]{2,}-\d+)?((?:([^)]+))?)\s?)(?:\n)?([A-Za-z\s]+)/\s+([^\n]+)
我只是问有没有简单/简短的方法来做到这一点?**
--问题陈述结束--
--所需输出详细信息开始--
匹配1:TRA-1728(CS-02)中等灰褐色/白色
组1:TRA-1728(CS-02)
第2组:中等灰褐色
第3组:白色
匹配2:TRA-1723(CS-02)白色冰/炭石板
组1:TRA-1723(CS-02)
第2组:白色冰
第三组:木炭石板
--所需输出详细信息结束--

g6ll5ycj

g6ll5ycj1#

你可以做的是选择性地重复包含\s的字符类,然后是不包含\s的字符类。
更改([A-Za-z\s]+)\/-> ([A-Za-z\s]*[a-zA-Z])\s*\/
调整后的模式为:

([A-Z]{2,}-\d+ ?(?:\([^)]+\))?)\s?\n?([A-Za-z\s]*[a-zA-Z])\s*\/\s+(.+)

参见regex demo

注意(?:\n)?可以缩短为\n?,反斜杠不需要转义,除非分隔符也是/

u5i3ibmn

u5i3ibmn2#

谢谢你的时间和宝贵的建议。
我开始认为,仅仅为了好奇心而要求社区使用这么多工时(每个人)来完成这样的任务并不是一件好事。
我用下面的答案来结束我的这个问题。
“在捕获组中使用子捕获组”

nbysray5

nbysray53#

  • "..... *

这是一个简化的模式。

(?:([A-Z]{2,}-\d+ ?\(.+?\))\s*)?(.+) / (.+)
TRA-1728 (CS-02), Medium Taupe, White
TRA-1723(CS-02), White Ice, Charcoal Slate

相关问题