年份的正则表达式,带有可选的右括号

时间:2014-07-17 21:35:53

标签: java regex

我正在努力使以下正则表达式(在Java中)很好地工作。我想看看一个字符串是否有一年,字符串可以是

Mar 3, 2014 

或有时使用右括号,例如

Mar 3, 2014)

我正在使用

text.matches("\\b((19|20)\\d{2})(\\)?)\\b")

在大多数情况下有效,但如果字符串在括号处结束则不匹配 如果我使用

text.matches("\\b((19|20)\\d{2})(\\)?)$") 

它匹配在括号后结束的文本,但不匹配具有另一个空格的字符串

我认为\ b会包含字符串结尾,但无法使其工作。

我知道我可以使用两个正则表达式,但这看起来真的很难看。

3 个答案:

答案 0 :(得分:1)

您的主要问题是matches检查整个字符串是否与正则表达式匹配。你想要的是测试字符串是否包含可由正则表达式匹配的子字符串。为此,请使用

Pattern p = Pattern.compile(yourRegex);
Matcher m = p.matcher(stringYouWantToTest);
if (m.find()){
    //tested string contains part which can be matched by regex
}else{
    //part which could be matched by regex couldn't be found
}

您还可以使用.*将正则表达式包围,以使其与您要查找的部分旁边的字符匹配,并使用您现在正在执行的匹配,

if(yourString.matches(".*"+yourRegex+".*"))

但这必须遍历整个字符串。


换句话说,您可以尝试使用Pattern / Matcher查找\\b(19|20)\\d{2}\\b或使用matches(".*\\b(19|20)\\d{2}\\b.*")之类的内容。

BTW括号)未包含在\w类中,因此\b会接受\w)之间作为字边界的位置,例如{{1} }将匹配正则表达式"9)"

答案 1 :(得分:0)

你的问题不是很清楚,但据我所知,这应该适合你:

text.matches("((?:19|20)(?:\\d){2})\\)?");

演示:http://regex101.com/r/lO0aH4/3

答案 2 :(得分:0)

您可以尝试以下方式:

".*(19|20)[0-9]{2}\\)?$"

我不确定它可以帮助你,最好给我们一个完整的字符串匹配示例。字符串必须以一年结束(带有可选括号),或者可能是之后的其他内容吗?