正则表达式,用于测试输入是否是模式中的 ok 子字符串



基本上,如果我有一个像

/^(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']

这是一个选项:

/^(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?)?)?)?)$/

你用的是什么技术?

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

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

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

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

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

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

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

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

个字符

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

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

(佛欧?|巴?r?

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

干杯。

相关内容

最新更新