我正在编写Java代码,必须将正则表达式与只有一个可能匹配的正则表达式中的多个可能匹配区分开来。
例如:
“ABC”。可以有几个匹配(“abc1”,abcf“,...), 而“abcd”只能匹配“abcd”。
现在我最好的想法是寻找所有未转义的正则表达式特殊字符。
我确信在Java中有更好的方法。想法?
(延迟补充):
为了使事情更清楚 - 没有特定的输入可供测试。解决此问题的一个好方法是测试正则表达式本身。
换句话说,我需要一种方法,其签名可能看起来像这样:
boolean isSingleResult(String regex)
如果仅用于一个可能的String s1,则此方法应返回true。表达式s1.matches(regex)将返回true。 (见上面的例子。)
答案 0 :(得分:1)
这听起来很脏,但值得一看Pattern class in the Java source code。
快速浏览一下,似乎'正常化'()是给定的正则表达式(第1441行),这可能会使表达变得更加可预测。我认为反思可以用来挖掘班级的一些私人资源(谨慎使用!)。在对正则表达式模式进行标记时,有可能在模式中达到某种“多重匹配”元素时有特定的指示。
<强>更新强>
仔细观察后,您可以使用包范围内的一些数据来利用Pattern tokenizer的工作来遍历正则表达式的节点并检查多字符节点。
编译正则表达式后,从Pattern.root开始迭代编译的“Node”。从类的第3034行开始,存在广义类型的节点。例如,类Pattern.All是多重匹配,而Pattern.SingleI或Pattern.SliceI是单匹配,依此类推。
所有这些令牌类似乎都在包范围内,因此应该可以在不使用反射的情况下执行此操作,而是创建一个java.util.regex.PatternHelper类来完成工作。
希望这有帮助。
答案 1 :(得分:0)
如果它只有一个可能的匹配,它不是 reeeeeally 一个表达式,现在,是吗?我怀疑你最好的选择是完全使用不同的工具,因为这根本不像正则表达式的工作,但如果你坚持,嗯,不,我会说你最好的选择是寻找未转义的特殊字符
答案 2 :(得分:0)
唯一可以匹配一个输入字符串的正则表达式是一个完全指定字符串的表达式。因此,您需要匹配没有通配符或字符组的表达式,并指定开始“^”和结束“$”锚点。
“快速”匹配:
“^快速棕色狐狸$”仅匹配:
答案 3 :(得分:0)
现在我明白你的意思了。我住在比利时......
所以这对大多数表达都有用。我自己写了这个。所以也许我忘记了一些规则。
public static final boolean isSingleResult(String regexp) {
// Check the exceptions on the exceptions.
String[] exconexc = "\\d \\D \\w \\W \\s \\S".split(" ");
for (String s : exconexc) {
int index = regexp.indexOf(s);
if (index != -1) // Forbidden char found
{
return false;
}
}
// Then remove all exceptions:
String regex = regexp.replaceAll("\\\\.", "");
// Now, all the strings how can mean more than one match
String[] mtom = "+ . ? | * { [:alnum:] [:word:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:]".split(" ");
// iterate all mtom-Strings
for (String s : mtom) {
int index = regex.indexOf(s);
if (index != -1) // Forbidden char found
{
return false;
}
}
return true;
}
马亭
答案 4 :(得分:-2)
我看到唯一的方法是检查正则表达式是否多次匹配特定输入。
package com;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AAA {
public static void main(String[] args) throws Exception {
String input = "123 321 443 52134 432";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(input);
int i = 0;
while (matcher.find()) {
++i;
}
System.out.printf("Matched %d times%n", i);
}
}