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

所以我在正则表达式方面非常糟糕......现在我搜索了一个小时,我能找到的最好答案就是这个。

但我仍然不能为了我而弄明白......

我需要的是以下内容:

我有一个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" - >匹配2nd
  • 输入: "G r" - >匹配3
  • 我真的很希望有人能够提供帮助,因为我完全失去了RegEx的这种混乱 - 我从来没有真正理解过他们或如何使用它们。


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

    在下面的函数中,您会注意到我们基本上构建了一个字符串,然后使用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"]


    例:

    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');
    }
    
    var array = ['Gurken halbiert 2kg', 'Karotten geschnitten 5kg', 'Gurken RW'];
    var filteredArray = array.filter(function (value) {
      return value.match(generateRegex('Gur'));
    });
    
    document.body.textContent = JSON.stringify(filteredArray);

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

    笔记

  • 从用户输入模式转义正则表达式字符(始终清理用户输入)。
  • 显式不使用“ 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>
    链接地址: http://www.djcxy.com/p/77083.html

    上一篇: Regex: Matching the first letter(s) of multiple words

    下一篇: Regex match two words and not match other