是否有一种优雅的方式在Java中进行部分正则表达式匹配?

时间:2009-09-29 17:26:14

标签: java regex

我需要检查给定字符串是否与给定的正则表达式部分匹配。例如,对于正则表达式ab[0-9]c,字符串“a”,“ab”,“ab3”和“b3c”将“匹配”,但不是字符串“d”,“abc”或“a3c” ”。我一直在做的是笨重的a(?:b(?:[0-9](?:c)?)?)?(仅适用于部分匹配,特别是那些“开始”匹配的),但由于这是API的一部分,我宁愿给出用户可以更直观地输入匹配的正则表达式。

如果描述不是很清楚(我意识到它可能不是!),这将用于验证文本框上的文本输入。我想阻止任何会导致无效字符串的编辑,但我不能将字符串与常规正则表达式匹配,因为直到它完全进入,它才会匹配。例如,使用上面的正则表达式(ab[0-9]c),当我尝试输入'a'时,它是不允许的,因为字符串“a”与正则表达式不匹配。

基本上,它是一种反向startsWith(),适用于regexp。 (new Pattern("ab[0-9]c").startsWith("ab3")应返回true。)

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

Matcher.hitEnd()是您要找的吗?

Pattern thePattern = Pattern.compile(theRegexString);
Matcher m = thePattern.matcher(theStringToTest);
if (m.matches()) {
    return true;
}
return m.hitEnd();

答案 1 :(得分:4)

虽然可能有一些技巧,但你的方式可能是最好的语义。它准确地描述了您正在寻找的内容。

然而,更大的问题是,您是否真的需要验证每个字符在文本框中输入的时间。你为什么不能在最后验证一次并省去一些麻烦?

答案 2 :(得分:2)

这是一个可以解决您的特定示例的正则表达式:

^(?:a|b|[0-9]|c|ab|b[0-9]|[0-9]c|ab[0-9]|b[0-9]c|ab[0-9]c)?$

一般来说,如果你可以将正则表达式分解为原子部分,你可以将它们的所有可能分组进行OR,但它很大而且很难看。在这种情况下,有4个部分(a,b,[0-9]和c),所以你必须OR一起4 + 3 + 2 + 1 = 10种可能性。 (对于 n 部分,它是( n ×( n +1))/ 2种可能性)。您可能能够以算法方式生成此算法,但测试将是一个巨大的痛苦。任何复杂的事情(如子组)都很难做对。

更好的解决方案可能只是在输入字段旁边有一条消息告诉用户“信息不足”或什么东西,当他们正确时将其更改为绿色复选框或其他内容。这是A List Apart最近的一篇文章,它重点讨论了这个问题的不同方法的优缺点:Inline Validation in Web Forms