JavaScript匹配函数似乎停止了脚本

JavaScript匹配函数似乎停止了脚本,javascript,regex,Javascript,Regex,昨天,“Hnatt”很好地提供了这个脚本的正则表达式部分: <html> <body> <script type="text/javascript"> alert("hhhhhh yadad example.com/check?x=asdfasdf bsss ffhhh".match(/example.com\/check\?x\=([^\s]*)/)[1]); alert('alert 2'); <

昨天,“Hnatt”很好地提供了这个脚本的正则表达式部分:

<html>
<body>
    <script type="text/javascript">
        alert("hhhhhh   yadad   example.com/check?x=asdfasdf bsss ffhhh".match(/example.com\/check\?x\=([^\s]*)/)[1]);
        alert('alert 2');
    </script>
</body>
</html>

警报(“hhhhhhhhyadad example.com/check?x=asdfasdf bsss ffhhh.match(/example.com\/check\?x\=([^\s]*)/)[1]);
警报(“警报2”);
现在我有一个新的问题/困惑点。如果我将'example.com'更改为notmatch,则整个脚本将停止。我想知道除try/catch之外的另一种解决方案,它允许脚本继续前进。(虽然我用try/catch破解了一个补丁,但插入try-catch/catch会破坏较大的脚本…我不知道为什么。这就是为什么我想要一个不包含try/catch的解决方案)。我还想尝试理解为什么在“match”函数找不到匹配项时会发生这种暂停

<html>
<body>
    <script type="text/javascript">
        alert("hhhhhh   yadad   exampleTwo.com/check?x=asdfasdf bsss ffhhh".match(/example.com\/check\?x\=([^\s]*)/)[1]);
        alert('alert 2');
    </script>
</body>
</html>

警报(“hhhhhhhhhyadad exampleTwo.com/check?x=asdfasdf bsss ffhhh.match(/example.com\/check\?x\=([^\s]*)/)[1]);
警报(“警报2”);

这是一个简明扼要的版本。在更广泛的脚本中,我使用了在草堆中找到的指针,并将其分配给变量。

如果没有匹配,则
.match()
方法返回null。当您试图获取
null
的索引
[1]
时,出现了一个错误,导致脚本停止。您应该检查以下内容:

var match=“hhhhh-yadad exampleTwo.com/check?x=asdfasdf bsss ffhhh”。match(/example.com\/check\?x\=([^\s]*)/);
如果(匹配){
警报(匹配[1]);
}
警报(“警报2”);

如果您不想生成脚本错误,也不想使用try/catch,那么您需要将匹配返回值分配给一个变量,并在使用它之前对其进行测试,以查看它是否找到匹配项以及是否找到足够的匹配项

var matches = "hhhhhh   yadad   exampleTwo.com/check?x=asdfasdf bsss ffhhh".match(/example.com\/check\?x\=([^\s]*)/);
if (matches && matches.length > 1) {
    alert(matches[1]);
}

杰里米解释了你为什么会出错。您可以确保索引操作有效,如下所示:

alert(("hhhhhh   yadad   exampleTwo.com/check?x=asdfasdf bsss ffhhh".match(/example.com\/check\?x\=([^\s]*)/) || [])[1]);

如果匹配失败,这会将匹配结果变为空数组。

只需将结果保存到一个变量,并检查该变量是否为null。fyi,如果只有一个匹配,这不一定有效。在引用匹配项[1]之前,您必须检查以确保至少有两个匹配项。当然,但是对于此模式,如果有任何
匹配项
,则将有一个
匹配项[1]
。控制台显示:未捕获类型错误:如果您只想知道字符串是否匹配,则无法读取null的属性“1”,使用
expressions.text(string)
。您可以将条件更改为简单if(匹配[1]),当匹配项为null时,您无法执行if(匹配[1]),而不会导致错误。看,真的,忘了。您是对的,只有链检查可以像您的或“matches&&matches[1]”一样使用。