我正在努力使以下正则表达式(在Java中)很好地工作。我想看看一个字符串是否有一年,字符串可以是
Mar 3, 2014
或有时使用右括号,例如
Mar 3, 2014)
我正在使用
text.matches("\\b((19|20)\\d{2})(\\)?)\\b")
在大多数情况下有效,但如果字符串在括号处结束则不匹配 如果我使用
text.matches("\\b((19|20)\\d{2})(\\)?)$")
它匹配在括号后结束的文本,但不匹配具有另一个空格的字符串
我认为\ b会包含字符串结尾,但无法使其工作。
我知道我可以使用两个正则表达式,但这看起来真的很难看。
答案 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})\\)?");
答案 2 :(得分:0)
您可以尝试以下方式:
".*(19|20)[0-9]{2}\\)?$"
我不确定它可以帮助你,最好给我们一个完整的字符串匹配示例。字符串必须以一年结束(带有可选括号),或者可能是之后的其他内容吗?