java - 带可选右括号的年份正则表达式

标签 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 会包含字符串结尾,但无法使其工作。

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

最佳答案

您的主要问题是 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/

相关文章:

java - Maven 3.5.0 抛出 ArrayIndexOutOfBoundsException,但使用 Maven 3.3.9 构建

PHP preg_replace 正则表达式问题

regex - 我应该创建一个复杂的RegEx还是创建多个且不太复杂的RegEx?

javascript - 优化正则表达式搜索电话#搜索结果(JS)?

regex - 如何在 bash 中使用 sed 按节获取 ini 文件的一部分

使用 Æ Ø Å 验证正则表达式电子邮件

java - 如何在java中拆分paint swing方法?

java - 舍入不起作用

java - 按字符对数组中的字符串进行排序

java - 使用 sl4j 从 eclipse osgi 插件登录