【问题标题】:Regex match string with whitespace if search query has no whitespace如果搜索查询没有空格,则正则表达式匹配字符串与空格
【发布时间】:2017-11-14 09:52:12
【问题描述】:

编辑澄清:oneword 是用户可能使用的搜索查询。我需要用这个正则表达式匹配onewordone wordword one


如何以任何给定的顺序匹配带有或不带有空格的字符串?

这是我当前的查询/^(?=.*one)(?=.*word).*$/i 学分:http://www.rubular.com/r/QFEfj9lMn3

所以给定文本 oneword one word word one 和搜索查询 /^(?=.*one)(?=.*word).*$/i 匹配所有三个,但 /^(?=.*oneword).*$/i 只匹配文本的第一部分。

有没有比在每个字母前添加一个可选字符更好的方法来解决这个问题?

谢谢

【问题讨论】:

  • 我不明白你的问题。您能否明确说明您希望从正则表达式匹配中得到什么结果。
  • 除非我遗漏了什么,否则你不能直接写出这两种可能性,比如:/one\s*word|word\s*one/?
  • 我从 searchQuery 中获取字符串。用户可能会搜索one wordoneword。我想创建一个匹配两个搜索字符串的正则表达式查询 oneword one word word one 的所有三个变体所以问题不是词序而是匹配它,如果搜索查询是用空格写的或没有空格(相反的方式是琐碎)
  • 你需要有一些的方法来知道这两个词是什么。执行如下搜索是不切实际的:s ?t ?a ?c ?k ?o ?v ?e ?r ?f ?l ?o ?w
  • 除非你有一些实用的方法来预测如何分割单词,否则我建议使用 ElasticSearch 而不是正则表达式。

标签: javascript regex search


【解决方案1】:

试试这个简单的正则表达式生成

function showMatches(sampleInput, searchInput) {
  console.log(sampleInput, searchInput);
  if (sampleInput.length && searchInput.length) {
    var regexStr = searchInput.split(" ").join("\\\s*") + "|" + searchInput.split(" ").reverse().join("\\\s*");
    var regex = new RegExp(regexStr, "gi");
    //console.log(regex);
    console.log(sampleInput.match(regex))
  }
}
showMatches("one word word one oneword", "one word");

说明

  • 将输入按空格分割得到单词。
  • 通过\\\s*加入他们
  • 重复对倒置的词也一样
  • 合并两者"|"

注意 - 您可能还想使用here 所示的方法从搜索输入中转义特殊的正则表达式字符。

【讨论】:

  • 感谢您详细解释的答案,但我不知道在哪里拆分这两个词。 searchInput 可能是 onewordone word 不匹配
  • 你不能,除非你有一本包含所有单词的字典,并且你想首先获得可能单词的匹配。匹配示例中从输入到word oneoneword 涉及自然语言处理,这太宽泛了。
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多