java正则表达式可选字符

时间:2012-04-29 20:11:15

标签: java regex

我在使正则表达式工作时遇到了问题。

正则表达式为:

([0-9]m)* ([0-9]f)*

数字必须在“m”或“f”之前,但“m”或“f”是可选的。例如:

1m 2f
1m
6f

我做错了什么?

1 个答案:

答案 0 :(得分:8)

*表示匹配前一个令牌0次或更多次,这看起来并不像你想要的那样。

这些应该可以帮助您构建所需的正则表达式:

  • ?表示0或1场比赛。
  • |进行更改。
  • (?:...)表示非捕获组。
  • ^$锚定在字符串的开头和结尾。

知道这一点,我想你可以自己找到解决方案,但为了完成,我将展示一种可能的解决方案。


您的问题不是很清楚,所以我只是假设您希望以下内容匹配:

1m 2f
1m
6f 
0m

并且您希望以下内容无法匹配:

1
m    
11m
1m 1m
2f 3m
1m  2f
"1m 2f"

如果这些假设不正确,那么请更清楚地说明问题。

根据这些假设,试试这个:

^[0-9]m(?: [0-9]f)?$|^[0-9]f$

如果您还希望2f 3m匹配,请使用以下内容:

^[0-9]m(?: [0-9]f)?$|^[0-9]f(?: [0-9]m)?$