我最近学习了捕获组和非捕获组。我需要匹配,但从输出跳过一个单一的空格字符的文本。
经过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组:白色冰
第三组:木炭石板
--所需输出详细信息结束--
3条答案
按热度按时间g6ll5ycj1#
你可以做的是选择性地重复包含
\s
的字符类,然后是不包含\s
的字符类。更改
([A-Za-z\s]+)\/
->([A-Za-z\s]*[a-zA-Z])\s*\/
调整后的模式为:
参见regex demo。
注意
(?:\n)?
可以缩短为\n?
,反斜杠不需要转义,除非分隔符也是/
u5i3ibmn2#
谢谢你的时间和宝贵的建议。
我开始认为,仅仅为了好奇心而要求社区使用这么多工时(每个人)来完成这样的任务并不是一件好事。
我用下面的答案来结束我的这个问题。
“在捕获组中使用子捕获组”
nbysray53#
这是一个简化的模式。