有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在努力使下面的正则表达式(Java)正常工作。我想看看字符串是否有一年,字符串是否可以是

Mar 3, 2014 

或者有时使用右括号,例如

Mar 3, 2014)

我正在使用

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

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

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

它匹配以括号结尾的文本,但不匹配具有其他空格的字符串

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

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


共 (3) 个答案

  1. # 1 楼答案

    你的问题不是很清楚,但据我所知,这应该对你有用:

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

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

  2. # 2 楼答案

    您的主要问题是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或类似matches(".*\\b(19|20)\\d{2}\\b.*")的方法来查找\\b(19|20)\\d{2}\\b

    顺便说一句,括号)不包括在\w类中,因此\b将接受\w)之间的位置作为单词边界,因此例如"9)"将匹配regex\d\b\)

  3. # 3 楼答案

    您可以尝试以下方法:

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

    我不确定它是否能帮助您,最好给我们一个完整的字符串匹配示例。字符串必须在一年前结束(带可选括号),还是在一年后结束