gpt4 book ai didi

Java重复模式匹配(三)

转载 作者:行者123 更新时间:2023-11-30 09:44:39 25 4
gpt4 key购买 nike

我正在尝试解决一个简单的 Java 正则表达式匹配问题,但仍然得到相互矛盾的结果(跟进 thisthat 问题)。

更具体地说,我正在尝试匹配一个重复文本输入,它由由“|”分隔的组组成(竖线)前面可能直接有下划线 ('_'),尤其是当组不为空时(即,如果输入中没有出现两个连续的 | 分隔符)。

这样的输入示例是:

Text group 1_|Text group 2_|||Text group 5_|||Text group 8

此外,我需要一种方法来验证匹配是否发生,以避免将与该输入相关的处理应用到我的应用程序也处理的其他完全不同的输入,使用不同的正则表达式。

为确认正则表达式有效,我使用 RegexPal .

经过多次测试,最接近我想要的是以下两个正则表达式,在我上面引用的问题中建议:

1. (?:\||^)([^\\|]*) 
2. \G([^\|]+?)_?\||\G()\||\G([^\|]*)$

使用其中任何一个,如果我运行一个 ma​​tcher.find() 循环,我会得到:

  • 正则表达式 1 中的所有文本组,下划线包含在末尾
  • 除了最后一个之外的所有文本组,没有下划线,但最后有 2 个空组,来自 Regex 2。

因此,显然 Regex 2 不正确(并且 RegexPal 也没有将其显示为匹配)。

我可以使用 Regex 1 并进行一些后处理以删除尾随的下划线,尽管理想情况下我希望 regex 为我执行此操作。

但是,对于 ma​​tcher.matches(),上述两个正则表达式都不返回真,而即使对于完全不相关的输入,ma​​tcher.find() 也始终为真(这是合理的,因为通常至少有 1 个匹配组,即使在其他文本中也是如此)。

因此我有两个问题:

  1. 是否有一个正确的(完全有效的)排除尾随下划线的正则​​表达式?
  2. 有没有办法检查只有正确的正则表达式匹配

用于测试 Regex 1 的代码类似于

String input = "Text group 1_|Text group 2_|||Text group 5_|||Text group 8";

Matcher matcher = Pattern.compile("(?:\\||^)([^\\\\|]*)").matcher(input);

if (matcher.matches())
{
System.out.println("Input MATCHED: " + input);

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

}
else
{
System.out.println("\tInput NOT MATCHED: " + input);
}

使用上面的代码总是会导致“不匹配”。删除 if/else 并仅使用 ma​​tcher.find() 会检索所有文本组

最佳答案

Matcher#matches 方法尝试将整个输入序列与模式匹配,这就是您得到结果 Input NOT MATCHED 的原因。请参阅此处的文档 http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html#matches

如果你想排除尾随的下划线,你可以使用这个正则表达式(对你已有的进行轻微修改)

(?:\\||^)([^\\\\|_]*)

如果您确定 _ 刚好在 | 之前,这将起作用。

关于Java重复模式匹配(三),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com