【问题标题】:Regex tester finds all 4 matches while Java code only finds 3 matches正则表达式测试器找到所有 4 个匹配项,而 Java 代码仅找到 3 个匹配项
【发布时间】:2019-08-20 17:38:16
【问题描述】:

我都使用过这个Java specific 正则表达式测试器和Regex101's 测试器 并且两者都可以找到以 # 开头的换行符的所有 4 个匹配项,如下面的示例字符串所示。字符串数据来自一个 UTF-8 文件。

#1

#2

#3

#4

但在 Android 中运行下面的 Java 代码时,只有 #2, #3, #4 是肯定匹配的。 编辑:我发现在 #1 上方放置一个空行会使其匹配,这解释了为什么所有其他人都得到匹配,因为它们上面都有空行

Java 代码:

Pattern pattern = Pattern.compile("^#.*", Pattern.CASE_INSENSITIVE | 
Pattern.MULTILINE);
    Matcher matcher = pattern.matcher(text);

    while (matcher.find()) {
        for (int i = 0; i <= matcher.groupCount(); i++) {
            String foundWord = matcher.group(i);
       }
    } 

就像matcher.find() 完全跳过了第一行

【问题讨论】:

  • 您可以使用^[\t ]*#.* 来说明可能出现在# 之前的随机空格
  • @MonkeyZeus 我尝试使用它,但它与其他模式相同
  • @MonkeyZeus 是因为#前面有一个空格。
  • 它与什么“其他”模式相同?我的模式与您的不同,因为它考虑了前导空格,这将解决您的 Java 问题。
  • @Andreas 是的,你完全正确。我的文本确实来自 UTF-8 文件并被加载到 String 变量中。我会调查这个我以前从未遇到过的“bom”

标签: java android regex


【解决方案1】:

也许您在 #1 或其他字符之前有一个空格。您的代码具有所需的输出

public static void main(String[] args) {
    String text = "#1 \n" +
            "#2\n" +
            "#3\n" +
            "#4\n" +
            "enter code here";

    Pattern pattern = Pattern.compile("^#.*", Pattern.CASE_INSENSITIVE |  Pattern.MULTILINE);
    Matcher matcher = pattern.matcher(text);

    while (matcher.find()) {
        System.out.println(matcher.group());
    }
}

输出

#1 
#2
#3
#4

【讨论】:

  • 如您所说,这是由于#1 之前的空格所致。文字只是一个例子。真正的内容更大,并且来自通过 API 的 Json 字符串。所以我猜我必须在换行之前清理空格或使用忽略它的模式
  • @Muddz 太棒了!您可以尝试使用"^[\\s#].*",基于Pattern doc \s 使用空格字符:[ \t\n\x0B\f\r]"
  • 我刚刚发现这不是因为新的# 行之前可能存在空白导致问题。请查看我编辑的问题。
  • 对不起,可能是空字符或特殊字符,例如 \0 \r \n \r\n \f。你可以试试"^[\0#].*"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多