我有三个正则表达式,其中一个应该匹配他们的模式,但是现在他们匹配的比他们自己的模式更多:
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匹配一个,所有这些都相互匹配。
如何更正正则表达式,以便每个只匹配自己的模式?
答案 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。
另请注意,我删除了字符类中的竖条,因为它在字括号内被解释。