【问题标题】:regular expressions to match user input string as it is typed正则表达式匹配用户输入的字符串,因为它是键入
【发布时间】:2012-10-28 01:10:38
【问题描述】:

有没有不同的方式来构建这样的正则表达式...

/^52\s*quarts(\s*\,*\s*|\s+)motor oil(\s*\,*\s*|\s+)las vegas(\s*\,*\s*|\s+)nv/i

...这样它为 "52 quarts motor oil las vega" 返回的匹配项将是 ["52 quarts motor oil las vega"]? p>

我正在尝试将缓存添加到 jQuery 自动完成的使用中,并且我想动态地将用户输入与准备好的正则表达式列表进行匹配。由于我需要提前准备好匹配表达式,所以不能因为比完整的用户输入字符串长而匹配失败!

【问题讨论】:

  • 错误的方法 - 使用基于文本的 nosql 数据库,如 lucene,它允许您在几毫秒内搜索文本中的单词
  • 好的,但我首先想要这个 hack。

标签: regex autocomplete


【解决方案1】:

我已经简化了你的正则表达式:

/^52[\s,]*quarts[\s,]*motor oil[\s,]*las vegas[\s,]*nv/i

如果你想允许任何顺序的单词,你可以使用前瞻:

/^(?=.*52)(?=.*quarts)(?=.*motor oil)(?=.*las vegas)(?=.*nv)/i

这种前瞻性的想法非常接近基于文本的搜索引擎的工作方式

编辑:

部分匹配变得有点难看。以下是您如何匹配单词的任何 部分 - 换句话说,“开始于”匹配:

l(a(s( (v(e(g(a(s)?)?)?)?)?)?)?)?

要至少要求“las ve”,请执行以下操作:

las ve(g(a(s)?)?)?

这太恶心了。但它就在那里。
您可以使用所有条款来做到这一点。

【讨论】:

  • 嗯,这确实有些作用。从这个字符串 “las vegas nv motor oil 52 quarts” 中,我得到了一个相同的匹配项。但是,您的正则表达式与我的原始测试字符串 “52 quarts motor oil las vega” 不匹配,这是我的基本需求。
  • @Lille 那是因为你从“拉斯维加斯”中去掉了“s”。如果您真的想匹配“Las Vega”,请在我的正则表达式中将“vegas”更改为“vega”。
  • 但这就是重点:可以使正则表达式部分匹配吗?所以,我想要你的正则表达式中的“vegas”,因为字符串中的“vegan”是错误的(对不起,伙计们),而字符串中的“vega”应该仍然匹配!顺便说一句 - 我认为正则表达式无法应对这一挑战。
  • @Lille 见编辑回答。你是对的;我们开始用正则表达式刮擦桶
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多