我正在努力让以下正则表达式(Java 中的)正常工作。我想看看一个字符串是否有年份,字符串可以是
Mar 3, 2014
或者有时带有右括号,例如
Mar 3, 2014)
我正在使用
text.matches("\\b((19|20)\\d{2})(\\)?)\\b")
在大多数情况下有效,但如果字符串以括号结尾则不匹配 如果我使用
text.matches("\\b((19|20)\\d{2})(\\)?)$")
它匹配以括号结尾的文本,但不匹配具有另一个空格的字符串
我认为\b 会包含字符串结尾,但无法使其工作。
我知道我可以使用两个正则表达式,但这看起来真的很难看。
最佳答案
您的主要问题是 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.*")
之类的东西。
顺便说一句,括号 )
不包含在 \w
类中,因此 \b
将接受 \w
和 )
之间的位置作为字边界,因此例如 "9)"
将匹配正则表达式 \d\b\)
。
关于java - 带可选右括号的年份正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24813941/