我在JS写了一个正则表达式测试器。但是,似乎对于某些正则表达式,我得到多个匹配。
例如,对于内容hello, world
,如果给出了正则表达式hello.*
,则报告它与hello, world
匹配。但是,如果正则表达式现在设置为(hello|goodbye).*
,则报告的匹配项为hello, world
和hello
,而它应仅为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('&','&').replace('<', '<').replace('>', '>'));
}
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>
有人可以帮我在我的代码中找到问题吗?
提前致谢。
答案 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
}
它只匹配给定的模式。