有没有一种优雅的方法可以在Java中进行部分正则表达式匹配?

有没有一种优雅的方法可以在Java中进行部分正则表达式匹配?,java,regex,Java,Regex,我需要的是检查给定的字符串是否部分匹配给定的正则表达式。例如,对于regexab[0-9]c,字符串“a”、“ab”、“ab3”和“b3c”将“匹配”,但字符串“d”、“abc”或“a3c”不匹配。我一直在做的是笨重的a(?:b(?[0-9](?:c)?)?(它只适用于部分匹配,特别是那些“开始”匹配的),但由于这是API的一部分,我宁愿给用户一种更直观的方式来输入匹配的regexp 如果描述不是很清楚(我意识到可能不是!),这将用于验证文本框上的文本输入。我想防止任何可能导致无效字符串的编辑,

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

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

基本上,它是一种反向的
startsWith()
,在regexp上工作。(
newpattern(“ab[0-9]c”)。startsWith(“ab3”)
应返回
true


有什么想法吗?

尽管可能有一些诡计,但从语义上讲,您的方式可能是最好的。它准确地描述了你在寻找什么


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

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

^(?:a|b|[0-9]|c|ab|b[0-9]|[0-9]c|ab[0-9]|b[0-9]c|ab[0-9]c)?$
一般来说,如果你能把正则表达式分解成原子部分,你可以把所有可能的正则表达式组合在一起,但它又大又丑。在本例中,共有4个部分(a、b、[0-9]和c),因此您必须将4+3+2+1=10的可能性组合在一起。(对于n个零件,它是(n×(n+1))/2个可能性)。您可能能够通过算法生成这个,但测试起来会非常痛苦。任何复杂的事情(比如一个小组)都很难正确处理

更好的解决方案可能是在输入字段旁边有一条消息,告诉用户“信息不足”或其他信息,当用户正确使用时,将其更改为绿色复选框或其他信息。这里有一篇最近的文章,来自一个列表,它权衡了解决这个问题的不同方法的优缺点:。

你在寻找Matcher.hitEnd()吗

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

“为什么”,事实上(因为客户端(tm)是这样规定的。我这样做的问题在于,除了非常不友好之外(我必须向API用户解释奇怪的部分匹配regexp等),它不会匹配与regex结尾匹配的字符串。在上面的示例中,它不会匹配“3c”,这应该是有效的,因为您始终可以返回并添加“ab”一开始。客户真的指定必须由正则表达式完成吗?还是设计的特定部分来自技术方面?客户没有指定必须由正则表达式完成,这是我们的设计决策。最初是通过简单的字符串匹配完成的,但我们最终决定使用正则表达式,因为atterns可能会变得非常复杂。仅供参考:
a(?:b(?:[0-9](?:c)?)?
将匹配任何包含“a”的字符串,例如“jazz”。您希望使用
^a(?:b(?:[0-9](?:c)?)?$
以便在整个字符串上进行匹配。客户端使用的所有正则表达式是否都像
ab[0-9]c
一样简单,还是需要更复杂的匹配(即,使用子组)?哦,是的,^和$会自动添加到regexp中,这就是我忽略添加它们的原因,谢谢。不,regexp不是那么简单,它们可能会变得非常复杂,尽管没有需要子组。这正是我试图避免的…笨拙的regexp(在您的示例中为“ed”,在我的示例中末尾包含可选的子组)。:(不幸的是,您提出的更好的解决方案不被客户接受。他们需要的是阻止非法字符(非法含义字符,不会导致有效字符串)的文本输入,以及完全有效字符串的视觉反馈(这意味着,在实现时,当字符串与正则表达式完全匹配时,文本框的背景会改变颜色)。也许您可以有两个步骤?一个步骤只运行
ab[0-9]c
并告知完整字符串是否有效,以及运行大正则表达式以告知他们输入的内容是否有效的字符串。您可以在按键事件上运行大正则表达式,如果失败,则返回false(即不允许用户输入该字符)如果我能用算法生成这些正则表达式,这将是一个有效的解决方案。为简单的正则表达式生成它们应该不会有太大的问题,但不幸的是,并不是所有使用的正则表达式都很简单。很好!它几乎可以工作。它肯定可以替代我目前正在做的工作。对于部分尾部匹配,它仍然不起作用(例如,“b3c”是
ab[0-9]c
的部分尾部匹配),但我当前的解决方案也不能处理这些问题的作用与OP自己的解决方案相同,即将正则表达式分成连续的可选组。但仍然无法检测与正则表达式开头不一致的部分匹配。