为正则表达式获取太多匹配

时间:2013-06-04 13:10:54

标签: javascript regex

我在JS写了一个正则表达式测试器。但是,似乎对于某些正则表达式,我得到多个匹配。

例如,对于内容hello, world,如果给出了正则表达式hello.*,则报告它与hello, world匹配。但是,如果正则表达式现在设置为(hello|goodbye).*,则报告的匹配项为hello, worldhello,而它应仅为hello, world

<!DOCTYPE html>
<html>
    <head>
        <title>Regex tester</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <script type="text/javascript">
            function resetform() {
                document.getElementById("results").innerHTML = "";
            }

            function escapetags(str) {
                return (str.replace('&','&amp;').replace('<', '&lt;').replace('>', '&gt;'));
            }

            function check() {
                if (!document.form1.re.value) {
                    document.getElementById("results").innerHTML = '<p style="color:red"><b>Error: No regular expression specified</b></p>';
                    return;
                }
                if (!document.form1.str.value) {
                    document.getElementById("results").innerHTML = '<p style="color:red"><b>Error: No content specified</b></p>';
                    return;
                }
                var pattern,
                modifiers = "";
                if (document.form1.nocase.checked) {
                    modifiers = "i";
                }
                if (document.form1.global.checked) {
                    modifiers = modifiers + "g";
                }
                try {
                    if (modifiers) {
                        pattern = new RegExp(document.form1.re.value, modifiers);
                    } else {
                        pattern = new RegExp(document.form1.re.value);
                    }
                } catch (excpt) {
                    document.getElementById("results").innerHTML = '<p style="color:red"><b>Error: Invalid regular expression</b></p>';
                    return;
                }
                var matches = pattern.exec(document.form1.str.value);
                if (matches == null) {
                    document.getElementById("results").innerHTML = '<p><b>Regular expression did not match with content<b></p>';
                } else {
                    document.getElementById("results").innerHTML = '<p><b>Regular expression matched with content</b></p><p>Matches:</p>';
                    for (var index = 0; index < matches.length; index++) {
                        document.getElementById("results").innerHTML += escapetags(matches[index]) + '<br>';
                    }
                }
            }
        </script>
        <h1>Regex tester</h1>
        <form name="form1">
            <p>Regex:</p>
            <input type="text" name="re" size="65"><br>
            <input type="checkbox" name="nocase">Case insensitive
            <input type="checkbox" name="global">Global
            <p>Content:</p>
            <textarea name="str" rows="8" cols="65"></textarea><br><br>
            <input type="button" value="Check" onclick="check();">
            <input type="button" value="Reset" onclick="reset();resetform();">
        </form>
        <div id="results"></div>
    </body>
</html>

有人可以帮我在我的代码中找到问题吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

(hello | goodbye)。然后报告的比赛是hello,world和hello *”

不,第二个“匹配”只是捕获组的结果(括号之间的内容)。忽略它,或使组不捕获:(?:hello|goodbye)

答案 1 :(得分:2)

JavaScript正则表达式的.exec()方法将整个匹配的字符串作为第一个元素返回,然后将所有捕获的组作为后续元素返回。当你使用正则表达式时:

(hello|goodbye).*

括号定义了一个捕获组,因此返回的数组将是

[0] = hello, world
[1] = hello

正如Loamhoof在下面建议的那样,如果不合适,可以添加?:以使群组无法捕获。

答案 2 :(得分:0)

我想你想要这样的东西,

var a = new RegExp("hello, world"); //or your string
var b = "hello, world";
if(a.test(b)){
   //do your stuff
}
else{
   //do your stuff
}

它只匹配给定的模式。