正则表达式:匹配多个单词的第一个字母
所以我在正则表达式方面非常糟糕......现在我搜索了一个小时,我能找到的最好答案就是这个。
但我仍然不能为了我而弄明白......
我需要的是以下内容:
我有一个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