当前位置: 首页 > 知识库问答 >
问题:

Java正则表达式Matcher.matches函数与整个字符串不匹配

詹弘毅
2023-03-14

我正在尝试将整个字符串与正则表达式匹配,但即使整个字符串不匹配,Matcher.match 函数也会返回 true。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {
    public static void main(String[] args) {
        final String string = "\"query1\" \"query2\" \"query3\"";
       // Unescaped Pattern: (\+?".*?[^\\]")(\s+[aA][nN][dD]\s+\+?".*?[^\\]")* 
       final Pattern QPATTERN = Pattern.compile("(\\+?\".*?[^\\\\]\")(\\s+[aA][nN][dD]\\s+\\+?\".*?[^\\\\]\")*", Pattern.MULTILINE);
        Matcher matcher = QPATTERN.matcher(string);
      
        System.out.println(matcher.matches());
        matcher = QPATTERN.matcher(string);  
        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }
    }
}

您可以从while循环中看到正则表达式只匹配字符串“query1”、“query2”和“query3”的一部分,而不匹配整个字符串。然而, matcher.matches()返回true。

我哪里出错了?

我也检查了https://regex101.com/的图案,整个字符串都不匹配。

共有2个答案

康锦
2023-03-14

使用grouping()时,匹配项将被分成组,因此您永远不会将整个字符串放在一组中。正则表达式本身看起来不错,但可能需要一些调整。此线程可能会帮助您:Regex查找所有匹配项

我也是新来的,所以很抱歉不能提供更多的帮助。

彭硕
2023-03-14

< code>matches()方法返回true,因为它需要完整的字符串匹配。您说您在regex101.com上测试了正则表达式,但是您忘记添加锚来模拟< code>matches()行为。

请参阅正则表达式证明您的正则表达式匹配整个字符串。

如果你想停止用这个表达式匹配整个字符串,不要使用 .*?,这个模式可以匹配很多。

(?s)(\+?\"[^\"\\]*(?:\\.[^\"\\]*)*\")(\s+[aA][nN][dD]\s+\+?\"[^\"\\]*(?:\\.[^\"\\]*)*\")*

转义版本:

String regex = "(?s)(\\+?\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")(\\s+[aA][nN][dD]\\s+\\+?\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")*";

说明

--------------------------------------------------------------------------------
  (?s)                     set flags for this block (with . matching
                           \n) (case-sensitive) (with ^ and $
                           matching normally) (matching whitespace
                           and # normally)
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \+?                      '+' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \"                       '"'
--------------------------------------------------------------------------------
    [^\"\\]*                 any character except: '\"', '\\' (0 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (0 or more
                             times (matching the most amount
                             possible)):
--------------------------------------------------------------------------------
      \\                       '\'
--------------------------------------------------------------------------------
      .                        any character
--------------------------------------------------------------------------------
      [^\"\\]*                 any character except: '\"', '\\' (0 or
                               more times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
    )*                       end of grouping
--------------------------------------------------------------------------------
    \"                       '"'
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  (                        group and capture to \2 (0 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    \s+                      whitespace (\n, \r, \t, \f, and " ") (1
                             or more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    [aA]                     any character of: 'a', 'A'
--------------------------------------------------------------------------------
    [nN]                     any character of: 'n', 'N'
--------------------------------------------------------------------------------
    [dD]                     any character of: 'd', 'D'
--------------------------------------------------------------------------------
    \s+                      whitespace (\n, \r, \t, \f, and " ") (1
                             or more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \+?                      '+' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \"                       '"'
--------------------------------------------------------------------------------
    [^\"\\]*                 any character except: '\"', '\\' (0 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (0 or more
                             times (matching the most amount
                             possible)):
--------------------------------------------------------------------------------
      \\                       '\'
--------------------------------------------------------------------------------
      .                        any character
--------------------------------------------------------------------------------
      [^\"\\]*                 any character except: '\"', '\\' (0 or
                               more times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
    )*                       end of grouping
--------------------------------------------------------------------------------
    \"                       '"'
--------------------------------------------------------------------------------
  )*                       end of \2 (NOTE: because you are using a
                           quantifier on this capture, only the LAST
                           repetition of the captured pattern will be
                           stored in \2)
 类似资料:
  • 问题内容: 如何检查整个字符串是否可以与正则表达式匹配?在Java中是方法 问题答案: 您需要结合使用锚(字符串锚的开始)和字符串锚的结束,并通过以下选项进行操作: 或者,您可以传递一个选项数组,其中仅将模式锚定在字符串的开头,您可以省略,但仍然需要锚定在字符串末尾: 观看在线Swift演示 另外,在此处使用with 是一种替代方法: 根据ICU v3,使用正则表达式样式的比较,左手表达式等于右手

  • 问题内容: 我在用Python将字符串中的数字匹配时遇到麻烦。尽管应该明确匹配,但甚至不匹配 或仅匹配。我的监督在哪里? 问题答案: 阅读文档:http : //docs.python.org/2/library/re.html#re.match 如果在零个或多个字符 开头 的 字符串 您要使用(或)

  • 问题内容: 我有一个输入字符串。 我正在考虑如何有效地将此字符串与多个正则表达式匹配。 我想针对这些正则表达式模式进行匹配,如果其中至少一种匹配则返回: 我不确定如何一次匹配多种模式。有人可以告诉我我们如何有效地做到这一点吗? 问题答案: 如果只有几个正则表达式,并且在编译时都知道它们,那么这就足够了: 如果它们更多,或者它们在运行时加载,则使用模式列表:

  • 问题内容: 我在尝试将我的javascript regex经验转移到Python时遇到了麻烦。 我只是想让它工作: …但是它打印无。如果我做: 它匹配…默认情况下是否匹配字符串的开头?当匹配时,如何使用结果? 我如何进行第一场比赛?是否有比python网站提供的文档更好的文档? 问题答案: 隐式添加到您的正则表达式的开头。换句话说,它仅在字符串的开头匹配。 将在所有位置重试。 一般来说,建议您在需

  • 问题内容: 在Swift中,查看字符串是否与模式匹配的简单方法是什么? 伪代码示例: (我已阅读斯威夫特文档并没有看到一个正则表达式的能力。我读过有关增加一个新的运营商是一个好主意,但不是我想,因为这是一个教学项目。我已经尝试了更复杂的,但收到错误:“字符串”没有成员“ rangeOfString”。我正在寻找一种Swift解决方案,即未键入NSRegularExpression。我不需要对匹配结

  • 我正在尝试匹配以下正则表达式: 换句话说,一个单词边界后跟上面的任何字符串(可选地跟一个句点字符),后面跟一个单词边界。 我也在regex101上尝试过这一操作,但与数仍然不匹配:https://regex101.com/r/klkmwl/1 转义符并没有什么区别,我已经尝试使用十六进制转义序列来代替和符(如本问题所建议的)。为什么这不匹配?

  • 问题内容: 我想匹配任何不包含字符串“ DontMatchThis”的字符串。 什么是正则表达式? 问题答案: 尝试这个:

  • 我需要一个与字符串中的子字符串匹配的正则表达式, 匹配的字符串必须是/*exa*/而不是/*exa*/mple*/。 它也不能包含。 我试过这些正则表达式: