1

语境:

假设我有一组完全不同的字符串,尽管它们可能共享起始序列,即apple, banana, bpple, canana, applf.

我将如何最好地使用正则表达式来匹配可以包含其中一个字符串的任何左开始子集的字符串?例如applebanana显然会匹配。banan,babp也是如此cb并且appl会模棱两可(因此不应该匹配)。

在动态构建的正则表达式(缓慢而丑陋)中使用生成的字符类,我可以为此制作一个匹配引擎。然而,这很复杂,当我尝试时,我最终会在 Python/pick-your-language 中完成大部分匹配逻辑并完全放弃正则表达式。是否有一些简洁的方法可以使用正则表达式进行这项工作?

最简单的方法可能是将每个可能的字符串(apple, banana等)分解成一个列表并按顺序匹配每个字符串,但是好奇心和固执让我想知道是否没有办法单独/主要使用正则表达式.

TL;博士:

有没有一种方法,使用正则表达式来匹配:当且仅当提供的字符串是给定字符串集中的一个唯一左开始的子字符串?

4

1 回答 1

2

不要使用正则表达式。你在找树叶

如果您绝对必须使用正则表达式,那么它们可以这样构建:

(a(p(p(le?)?)?)?|b(a(n(a(na?)?)?)?)? ...)

编写一些构造它的代码很容易,但是您将无法找出实际匹配的内容(例如,用户输入“app”-您可能想知道它与“apple”匹配)。此外,修改它以确保不超过一个匹配项确实很麻烦。构造正则表达式的代码将比仅仅创建一个 trie 复杂得多(事实上,您可能必须创建与 trie 等效的东西才能创建正则表达式,这是您所要求的)。

于 2013-03-30T22:16:48.320 回答