首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >regex匹配的问题,太多的匹配

regex匹配的问题,太多的匹配
EN

Stack Overflow用户
提问于 2013-12-02 10:59:42
回答 2查看 148关注 0票数 0

我有三个规则,其中一个应该与它们的模式相匹配,但现在它们比它们自己的模式更匹配:

代码语言:javascript
运行
复制
1. Input: test 1-2-22
regex ^([a-z|A-Z|\s]*)(\d*)-(\d*)-(\d*)$
I want to capture "test", "1", "2" and "22" in groups

2. Input: ooi 4-11-58 test^two^ one 1 two
regex ^([a-z|A-Z|\s]*)(\d*)-(\d*)-(\d*)(.+)$
I want to capture "ooi", "4", "11", "58", "test^two^ one 1 two" in groups

3. Input: one two three 3-11 four and five T1 F
regex ^([a-z|A-Z|\s]*)(\d*)-(\d*)(.+)$
I want to capture "one two three", "3", "11", "four and five T1 F" in groups

我在每个输入字符串上应用每个正则表达式,它应该只传递其中的一个。

现在发生的情况是regex 1是2和3的匹配,regex 2是匹配的,它们都是相互匹配的。

我如何才能纠正正则表达式,使每个匹配只各自的模式?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-02 11:09:07

代码语言:javascript
运行
复制
String regex_0 = "^([a-zA-Z]+)\\s+(\\d+)-(\\d+)-(\\d+)$";

String regex_1 = "^([a-zA-Z]+)\\s+(\\d+)-(\\d+)-(\\d+)\\s+([a-zA-Z0-9\\s]+)$"

String regex_2 = "^([a-zA-Z\\s]+)(\\d+)-(\\d+)\\s+([a-zA-Z0-9\\s]+)$"

注意:[a|b]作为一个字符类做而不是表示"a or b",它意味着"a or b or |"

另外,也不确定您是否真的需要*,因为它们意味着任何数量,据我所知,您似乎想要+,这意味着一个或多个。

票数 1
EN

Stack Overflow用户

发布于 2013-12-02 11:13:25

.太宽容了,它可以捕捉任何东西,包括破折号和数字。这就是为什么第三个表达式都匹配的原因--其中的.+匹配第二个模式的"-58 test^two^ one 1 two"文本,或者第一个模式的"-21"

您需要在正则表达式中添加一些标记来区分模式。例如,您可以修改#3,表示.+的第一个字符必须不是破折号或数字,如下所示:

代码语言:javascript
运行
复制
^([a-zA-Z\s]*)(\d*)-(\d*)([^\d-].*)$

注意我添加的[^\d-]组。它说,表达式中的.+中的第一个字符不能是数字或破折号。这将防止#3捕获#1或#2。

还请注意,我删除了字符类中的垂直条,因为它实际上是在方括号内解释的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20326629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档