【问题标题】:Unable to Match Using Regex in Java无法在 Java 中使用正则表达式进行匹配
【发布时间】:2016-09-16 05:25:56
【问题描述】:

我刚才问了这个问题,但没有得到正确的答案,所以再试一次。

class Test {
    public static void main (String[] args) throws java.lang.Exception
    {
        String file_name = "C:\\Temp\\Test.txt";
        String string = FileUtils.readFileToString(new File(file_name), "UTF-8");
        String regex = "^(ipv6 pim(?: vrf .*?)? rp-address .*)";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(string);
        if (matcher.find()) {
            System.out.println("Matcher: " + matcher.group(1));
        } else {
            System.out.println("No Matches");
        }
    }
}

该文件包含很多行,超过 750 行,我想,我想提取与正则表达式值匹配的所有行。现在的问题是,我完成代码的方式不返回任何匹配项。我只在文件的第一行与正则表达式匹配时才这样做,如果它在中间的某个地方,那就没有运气了。我认为由于一切都在新行中,因此会引起问题。但是,如果模式不匹配在开头,即使编写一些将字符串转换为单行的代码也不会返回值。

匹配字符串示例:ipv6 pim rp-address 20:20:20::F

【问题讨论】:

  • 您的正则表达式不起作用。在RegExr 上进行测试证明了这一点。我做了一个(脏)匹配:(ipv6\spim\srp-address\s([\d]{2}:)+:.)
  • 我测试了它并且确实如此。如果使用多行模式(见下文)或将所有文本放在一行中,则前导 ^(行首)可能会出现问题。
  • @CoronA 你是对的。问题是领先的^

标签: java regex match


【解决方案1】:

尝试使用 MULTILINE 修饰符:

Pattern p = Pattern.compile(regex, Pattern.MULTILINE);

【讨论】:

  • 不幸的是没有运气! :(
  • 感谢 Vineet/Rambler,将这两种解决方案结合起来很有效! :) 太棒了!
【解决方案2】:

不要使用 if 条件,而是将其切换到 while 循环。

while (matcher.find()) {
    System.out.println("Matcher: " + matcher.group(1));
}

find() 搜索 一个 匹配值。要获得下一个,您必须再次调用find(),因此是循环。

此外,^ 会阻止您再次匹配,因为后续搜索不匹配 starting with 条件。所以你可以放弃^

或者,正如 Rambler 建议的那样,使用 Pattern.MULTILINE 标志。这将确保 ^ 在每个新行的开头使用,而不是在整个字符串的开头使用一次。

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多