我有这段代码:
<!DOCTYPE html>
<html>
<head>
<script>
words = ["hi2", "say3", "you1", "me1"],
regex1 = /[\S]{2,3}[1|2|3]/g,
window.word_text = function(){
var data = document.getElementById("input").value.split(" ")
for (i = 0; i < data.length; i++){
for (j = 0; j < words.length; j++){
if (regex1.exec(data[i]) == words[j]){
console.log("match");
}
else{
console.log("no match")
}
}
}
}
</script>
</head>
<body>
<input id="input" type="text" onblur="word_text()">
</body>
</html>
当data [i]是一个很好的匹配(&#34; hi2&#34;)时,指令并不总是被执行,所以我的正则表达式似乎有问题。请注意,没有g(多个匹配)它确实可以正常工作,但我需要它,因为在if语句&#34; hi2&#34;将被一个数组替换 那些有两三个字母后面跟着1,2或3的东西。所以我需要我的数据[i]来识别&#34; hi2say1&#34;匹配&#34; hi2&#34;和&#34; say1&#34;。
非常感谢你的帮助!
答案 0 :(得分:1)
您的逻辑可以简化。看一下代码,你真的只对words
列表中的完全匹配感兴趣,所以制作一个只表示是否匹配单词的正则表达式并不是那么有用。你做的内在比较,并不需要正则表达式。
变化:
regex1.exec(data[i]) == words[j]
要:
data[i] == words[j]
......它会起作用。控制台将显示很多&#34;没有匹配&#34;和一些&#34;匹配&#34;。
但是,您可以使用正则表达式来提高代码的效率,但它应该完全匹配,并且只能匹配单词列表中的内容。这是你如何做到的:
var words = ["hi2", "say3", "you1", "me1"],
regex1 = new RegExp('\\b(' + words.join('|') + ')\\b', 'g'),
input = document.getElementById("input"),
output = document.getElementById("output");
function word_text(){
var data = input.value,
match = data.match(regex1);
if (match) {
output.textContent = "matches: " + match;
}
else{
output.textContent = "no match";
}
}
// link event handler, and run it now
input.oninput = word_text;
word_text();
&#13;
Type here: <input id="input" style="width:100%" value="can hi2 this is a test for you1">
<div id="output"></div>
&#13;
答案 1 :(得分:1)
如果您正在使用带有全局标记的表达式,exec
将在每次连续调用时前进字符串,并产生新的匹配项。每次通话都将从上一场比赛开始时进行搜索。
在某些时候,您将到达最后一场比赛。此时调用exec
将找不到更多匹配项,并返回null
。表达式lastIndex
标志将被重置,另一次调用exec
将从头开始重新搜索:
regex1 = /[\S]{2,3}[1|2|3]/g
var input = 'hi2say1';
for(var i = 0; i < 10; i++)
console.log(i, JSON.stringify(regex1.exec(input)));
exec
的结果旨在在非空时进行迭代,以允许您检查全局表达式中的每个连续匹配。由于您在迭代每个单词,因此您不需要在每次迭代时检查表达式中的每个匹配项 - 您一次只是明确地搜索单个短语。使用简单的indexOf
:
var words = ["hi2", "say3", "you1", "me1"];
var data = 'say1hi2abc a1hi2'.split(" ");
for (i = 0; i < data.length; i++){
for (j = 0; j < words.length; j++){
if (data[i].indexOf(words[j]) >= 0){
console.log("MATCH!", data[i], "does contain", words[j]);
} else {
console.log("No match.", words[j], "was not found in", data[i]);
}
}
}