0

基本上,如果我有一个像

/^(foo|bars)$/

我希望它成功

['', 'f', 'fo', 'foo', 'b', 'ba', 'bar', 'bars']

但后来失败了

['j', 'fa', 'foos'...]

我知道一些已经给出的答案,

/^(f(oo?)?|b(ar?)?)$/

或者

/^f|fo|foo|b|ba|bar$/

虽然它们确实有效,但对于这种特定情况,这不是我宁愿采用的方式,如果将其扩展到 20 个长字,它就会变得难以管理。如果可能的话,我希望有一个更优雅的解决方案。

有什么优雅的想法吗?在我使用它的地方,我可以,而不是正则表达式,传递一个字符串列表,然后检查任何字符串的输入索引是否为 0,但我只是想看看是否有一种方法可以用正则表达式来做。

感谢所有答案,但我主要是在寻找尽可能多的“优雅”解决方案,但在浏览完之后,我不确定是否有一个。

基本上,这是一种强制输入预防。我想要的类似于 Dojo 的 ValidationTextBox,http://dojotoolkit.org/reference-guide/1.7/dijit/form/ValidationTextBox.html。在那里,它会尽快告诉您输入是否与验证模式不匹配(我......可能最终会这样做),但我只想允许正确的输入及其路径.

换句话说,我试图找出是否有任何优雅的方法来查看您是否可以仅针对相同长度的模式检查输入字符串,例如,如果您只输入一个字符,它实际上只针对

/^(f|b)$/

在这种情况下,两个字符,

/^(fo|ba)$/

等等。

虽然我的具体答案是关于正则表达式的交替,但我很想知道一般的正则表达式(从我读过的内容来看,这似乎不太可能)。

我的意思是,如果你有,

/^The dog$/

我想要一种让所有人都能成功测试的方法

['', 'T', 'Th',...'The dog']
4

4 回答 4

2

这是一个选项:

/^(f(oo?)?|b(ar?)?)$/

我假设您希望整个字符串与这些匹配,而不是其他任何东西,因为如果可以找到部分匹配,那么它等同于仅检查字符串 ( /[fb]/) 中任意位置的任一子字符串的第一个字符。

这是一个较长字符串的示例,使用 'hello' 和 'world' 而不是 'foo' 和 'bar':

/^(h(e(l(lo?)?)?)?|w(o(r(ld?)?)?)?)$/

它需要更多字符,但您可以使用非捕获组来提高效率:

/^(?:h(?:e(?:l(?:lo?)?)?)?|w(?:o(?:r(?:ld?)?)?)?)$/
于 2012-04-12T20:29:45.597 回答
0

/f|fo|foo|b|ba|bar/

哎呀!您的答案无法提交,因为:

正文必须至少为 30 个字符;你输入了 19

于 2012-04-12T20:29:10.823 回答
0

你用的是什么技术?

我问是因为“优雅”的技术解决方案可能是编写一个程序,该程序从允许的输入字符串为您生成正则表达式模式,而不是尝试手动构建它。

如果这是在具有单个字符输入的交互式应用程序中,则有类似的策略(编写程序来创建正则表达式),但是为 1 个字符输入生成一个正则表达式模式,一个用于 2 个字符,一个用于 3 个字符等,这将根据输入长度进行选择。

对于固定字符串,我很想做类似的事情:

for each string:
    if string has a character match at the nth position:
        retain string
    else:
        remove string from further consideration

这也将支持完成,即向用户发出信号,不需要再键入任何内容,因为只有一个可能的匹配字符串。

于 2012-04-12T22:36:17.407 回答
-1

你可以这样写你的正则表达式:

http://fiddle.re/p73n(链接到正则表达式)

(fo?o?|ba?r?)。

如果单词列表不经常更改且不大,那可能是一个很好的解决方案。如果单词列表相当动态,您可能需要检查 entry.starstWith(yourInput)。

干杯。

于 2012-04-12T20:36:25.997 回答