Javascript正则表达式无法正常工作

时间:2016-08-28 14:26:02

标签: javascript regex

我有这段代码:

<!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;。

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您的逻辑可以简化。看一下代码,你真的只对words列表中的完全匹配感兴趣,所以制作一个只表示是否匹配单词的正则表达式并不是那么有用。你做的内在比较,并不需要正则表达式。

变化:

regex1.exec(data[i]) == words[j]

要:

data[i] == words[j]

......它会起作用。控制台将显示很多&#34;没有匹配&#34;和一些&#34;匹配&#34;。

但是,您可以使用正则表达式来提高代码的效率,但它应该完全匹配,并且只能匹配单词列表中的内容。这是你如何做到的:

&#13;
&#13;
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;
&#13;
&#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]);
    }
  }
}