正则表达式:匹配多个单词的第一个字母

时间:2015-12-04 16:04:35

标签: javascript regex

所以我对正则表达式的东西很不好......我现在用Google搜索了一个小时,我能找到的最佳答案是this one

但我仍然无法为我解决这个问题......

我需要的是以下内容:

我需要一个JS数组.filter()。此数组包含例如:

[ 'Gurken halbiert 2kg', 'Karotten geschnitten 5kg', 'Gurken RW' ]

例如:所有以下输入应与第一个条目("Gurken halbiert 2kg")匹配:

  • "Gu ha"
  • "gur h"
  • "gu halbi"

以下输入不匹配

  • "ken halbi"
  • "urk ha"
  • "gur biert"

为什么呢?因为任何单词开头的一个或多个字母都缺失了。

更多示例输入及其应匹配的条目:

  • 输入:"Gur" - >匹配第1和第3条
  • 输入:"Kar g 5" - >匹配第二
  • 输入:"G r" - >匹配第3个

我真的希望有人可以提供帮助,因为我在这个RegEx混乱中完全迷失了 - 我从来没有真正了解它们或如何使用它们。

2 个答案:

答案 0 :(得分:3)

由于输入变化,您需要动态生成正则表达式。

在下面的函数中,您会注意到我们基本上构建了一个字符串,然后使用passport.use(savedStrategy)创建了正则表达式。

表达式以插入符号开头,然后基本上遵循以下模式:

new RegExp(string, 'i')

值得指出的是,在每个输入字符串后添加^[[nth input char(s)]]\w*\s+[[nth input char(s)]]\w*\s+[[nth input char(s)]]\w* ,如果它不是最后一个输入字符串(即不是结尾),则添加\w*

\s+

然后,您可以在数组上使用function generateRegex (input) { var string = '^', arr = input.trim().split(' '); arr.forEach(function (chars, i) { string += chars + '\\w*' + (arr.length - 1 > i ? '\\s+' : ''); }); return new RegExp(string, 'i'); } 方法并返回匹配的元素:

.filter()

输出:

var array = ['Gurken halbiert 2kg', 'Karotten geschnitten 5kg', 'Gurken RW']; var filteredArray = array.filter(function (value) { return value.match(generateRegex('Gur Ha')); }); 符合:'Gur Ha'

["Gurken halbiert 2kg"]符合:'Gur'

["Gurken halbiert 2kg", "Gurken RW"]符合:'Kar g 5'

["Karotten geschnitten 5kg"]符合:'G r'

实施例

["Gurken RW"]

答案 1 :(得分:1)

以下是如何按指定过滤用户输入的示例。

注释

  • 从用户输入模式中转义正则表达式字符(始终清理用户输入)。
  • 明确不使用“\w”以支持“é”等字符。
  • 支持<space>以外的空白字符,例如<tab>,可以将其复制并粘贴到用户输入字段中,从而导致用户认为它已损坏。

function doSubmit() {
  // Get the user input search pattern string 
  var userInput = document.getElementById("myinput").value,

    // List of strings to search
    testList = [
      'Gurken halbiert 2kg',
      'Karotten geschnitten 5kg',
      'Gurken RW'
    ],



    // Between our "words" we allow zero or more non-space characters "[^\s]*"
    //  (this eats any extra characters the user might not have specified in their search pattern)
    // followed by one or more white-space characters "\s+"
    //  (eating that space between the "words")
    // Note that we are escaping the "\" characters here.
    // Note we also don't use "\w" as this doesn't allow for characters like "é".
    regexBetween = '[^\\s]*\\s+',

    // Match the start of the string "^"
    // Optionally allow one or more "words" at the start
    //  (this eats a "word" followed by a space zero or more times).
    // Using an empty string here would allow "o g" to match the 2nd item in our test array.
    regexStart = '^(?:' + regexBetween + ')*',

    // Clean whitespace at begining and end
    regexString = userInput.trim()

      // Escape any characters that might break a regular expression
      // Taken from: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions
      .replace(/[.*+?^${}()|[\]\\]/g, "\\$&")

      // Split into array of "words"
      .split(/\s+/)

      // Combine the "words" building our regular expression string
      .join(regexBetween),

    // Create the regular expression from the string (non-case-sensitive 'i')
    regexObject = new RegExp(regexStart + regexString, 'i'),

    // Filter the input array testing for matches against the regular expression.
    resultsList = testList.filter(function(item) {
      return regexObject.test(item);
    });

  // Ouput the array into the results text area, one per line.
  document.getElementById('output').value = resultsList.join('\n') + '\n===the end===';
}
<form id="myform" onsubmit="doSubmit(); return false;">
  <input type="text" id="myinput" value="" />
  <input type="submit" name="submit" />
</form>
<textarea id="output" rows="5" cols="30">
</textarea>