正则表达式匹配的问题,匹配太多

时间:2013-12-02 10:59:42

标签: java regex

我有三个正则表达式,其中一个应该匹配他们的模式,但是现在他们匹配的比他们自己的模式更多:

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

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

现在发生的是正则表达式1匹配2和3,正则表达式2匹配一个,所有这些都相互匹配。

如何更正正则表达式,以便每个只匹配自己的模式?

2 个答案:

答案 0 :(得分:1)

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 :(得分:1)

.过于宽松,它会捕捉任何东西 - 包括破折号和数字。这就是为什么你的第三个表达式匹配所有三个 - 其中.+匹配第二个模式的"-58 test^two^ one 1 two"文本,或第一个模式的"-21"

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

^([a-zA-Z\s]*)(\d*)-(\d*)([^\d-].*)$

请注意我添加的[^\d-]组。它表示表达式.+中的第一个字符必须是数字或破折号。这样可以防止#3捕获#1或#2。

另请注意,我删除了字符类中的竖条,因为它在字括号内被解释。