首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java重复模式匹配(3)

Java重复模式匹配(3)
EN

Stack Overflow用户
提问于 2011-10-16 19:20:50
回答 2查看 1.6K关注 0票数 2

我试图解决一个简单的Java匹配问题,但仍然得到了相互矛盾的结果(跟进问题)。

更具体地说,我试图匹配一个重复文本输入(),该输入由由‘’(垂直栏)分隔的组组成,这些组的前面可以直接加上下划线('_'),特别是当组不是空的时候(即,如果输入中没有两个连续的双倍分隔符)。

这种输入的一个例子是:

代码语言:javascript
复制
Text group 1_|Text group 2_|||Text group 5_|||Text group 8

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

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

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

代码语言:javascript
复制
1. (?:\||^)([^\\|]*) 
2. \G([^\|]+?)_?\||\G()\||\G([^\|]*)$

使用这两种方法中的任何一种,如果我运行一个matcher.find()循环,就会得到:

  • Regex 1中包含下划线的所有文本组。
  • 除了最后一个文本组之外,所有文本组都没有下划线,但最后有两个空组,来自Regex 2。

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

我可以使用Regex 1并做一些后处理来删除尾随下划线,不过理想情况下,我希望正则表达式能帮我做到这一点。

但是,上述两个正则表达式中没有一个返回matcher.matches(),的true,而对于完全不相关的输入,matcher.find()总是正确的(合理,因为通常至少有一个匹配组,即使在其他文本中也是如此)。

因此,我有两个问题

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

用于测试Regex 1的代码如下所示

代码语言:javascript
复制
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/ text并仅使用matcher.find()将检索所有文本组。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-16 19:37:31

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

如果要排除尾随下划线,可以使用此正则表达式(对已有的内容稍加修改)。

代码语言:javascript
复制
(?:\\||^)([^\\\\|_]*)

如果您确信_是在|之前出现的,这是可行的。

票数 1
EN

Stack Overflow用户

发布于 2011-10-16 20:18:57

RegexPal是一个JavaScript正则表达式工具。Java和JavaScript正则表达式语言不同。考虑使用Java工具;也许是这一个

这可能接近您想要的结果:(?:([^_\|]+)_{0,1}+\|*)+

编辑:添加了代码。在java 6中,这将打印每个组( find()循环)。

代码语言:javascript
复制
public static void main(String[] args)
{
    String input = "Text group 1_|Text group 2_|||Text group 5_|||Text group 8";
    Matcher matcher;
    Pattern pattern = Pattern.compile("(?:([^_\\|]+)_{0,1}+\\|*)+");
    Pattern groupPattern = Pattern.compile("(?:([^_\\|]+)_{0,1}+\\|*)");

    matcher = pattern.matcher(input);
    if (matcher.matches())
    {
        Matcher groupMatcher;

        System.out.println("matcher.matches() is true");
        int groupCount = matcher.groupCount();
        for (int index = 1; index <= groupCount; ++index)
        {
            System.out.print("group (pattern)[");
            System.out.print(index);
            System.out.print("]: ");
            System.out.println(matcher.group(index));
        }

        groupMatcher = groupPattern.matcher(input);
        while (groupMatcher.find())
        {
            System.out.print("group (groupPattern):");
            System.out.println(groupMatcher.group());
                            System.out.println(groupMatcher.group(1));
        }
    }
    else
    {
        System.out.println("No match");
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7786672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档