所以我对正则表达式的东西很不好......我现在用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混乱中完全迷失了 - 我从来没有真正了解它们或如何使用它们。
答案 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>