Why doesn't this regex work as expected in Java?

后端 未结 3 1023
别跟我提以往
别跟我提以往 2020-11-29 12:35

trivial regex question (the answer is most probably Java-specific):

\"#This is a comment in a file\".matches(\"^#\")

This returns false. As

相关标签:
3条回答
  • 2020-11-29 12:54

    This should meet your expectations:

    "#This is a comment in a file".matches("^#.*$")
    

    Now the input String matches the pattern "First char shall be #, the rest shall be any char"


    Following Joachims comment, the following is equivalent:

    "#This is a comment in a file".matches("#.*")
    
    0 讨论(0)
  • 2020-11-29 12:56

    The matches method matches your regex against the entire string.

    So try adding a .* to match rest of the string.

    "#This is a comment in a file".matches("^#.*")
    

    which returns true. One can even drop all anchors(both start and end) from the regex and the match method will add it for us. So in the above case we could have also used "#.*" as the regex.

    0 讨论(0)
  • 2020-11-29 13:02

    Matcher.matches() checks to see if the entire input string is matched by the regex.

    Since your regex only matches the very first character, it returns false.

    You'll want to use Matcher.find() instead.

    Granted, it can be a bit tricky to find the concrete specification, but it's there:

    • String.matches() is defined as doing the same thing as Pattern.matches(regex, str).
    • Pattern.matches() in turn is defined as Pattern.compile(regex).matcher(input).matches().
      • Pattern.compile() returns a Pattern.
      • Pattern.matcher() returns a Matcher
    • Matcher.matches() is documented like this (emphasis mine):

      Attempts to match the entire region against the pattern.

    0 讨论(0)
提交回复
热议问题