我试图解决一个简单的Java匹配问题,但仍然得到了相互矛盾的结果(跟进这和那问题)。
更具体地说,我试图匹配一个重复文本输入(),该输入由由‘’(垂直栏)分隔的组组成,这些组的前面可以直接加上下划线('_'),特别是当组不是空的时候(即,如果输入中没有两个连续的双倍分隔符)。
这种输入的一个例子是:
Text group 1_|Text group 2_|||Text group 5_|||Text group 8此外,我需要一种验证匹配是否发生了的方法,以避免将与该输入相关的处理应用于我的应用程序也使用不同正则表达式处理的其他完全不同的输入。
为了确认正则表达式有效,我使用了RegexPal.
经过几次测试后,最接近我想要的是以下两个正则表达式,这是我在上面引用的问题中提出的:
1. (?:\||^)([^\\|]*)
2. \G([^\|]+?)_?\||\G()\||\G([^\|]*)$使用这两种方法中的任何一种,如果我运行一个matcher.find()循环,就会得到:
因此,显然Regex 2是不正确的(而且RegexPal也没有将其显示为匹配)。
我可以使用Regex 1并做一些后处理来删除尾随下划线,不过理想情况下,我希望正则表达式能帮我做到这一点。
但是,上述两个正则表达式中没有一个返回matcher.matches(),的true,而对于完全不相关的输入,matcher.find()总是正确的(合理,因为通常至少有一个匹配组,即使在其他文本中也是如此)。
因此,我有两个问题
用于测试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/ text并仅使用matcher.find()将检索所有文本组。
发布于 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
如果要排除尾随下划线,可以使用此正则表达式(对已有的内容稍加修改)。
(?:\\||^)([^\\\\|_]*)如果您确信_是在|之前出现的,这是可行的。
发布于 2011-10-16 20:18:57
RegexPal是一个JavaScript正则表达式工具。Java和JavaScript正则表达式语言不同。考虑使用Java工具;也许是这一个
这可能接近您想要的结果:(?:([^_\|]+)_{0,1}+\|*)+
编辑:添加了代码。在java 6中,这将打印每个组( find()循环)。
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");
}
}https://stackoverflow.com/questions/7786672
复制相似问题