Vas*_*sil 16 javascript regex string match
请考虑以下示例:
<html>
<body>
<script type="text/javascript">
var str="filename.jpg";
var pattOne = new RegExp('\.[^\.]*$');
var pattTwo = new RegExp('(\.[^\.]*$)');
var pattThree = new RegExp('(\.[^\.]*$)', 'g');
document.write(str.match(pattOne));
document.write('<br>');
document.write(str.match(pattTwo));
document.write('<br>');
document.write(str.match(pattThree));
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
结果如下:
.jpg
.jpg,.jpg
.jpg
Run Code Online (Sandbox Code Playgroud)
我期待这个结果:
.jpg
.jpg
.jpg
Run Code Online (Sandbox Code Playgroud)
为什么在正则表达式周围放置括号会改变结果?为什么使用'g'修饰符会再次改变结果?
Fel*_*ing 27
来自String.prototype.match
[MDN]:
如果正则表达式不包含该
g
标志,则返回相同的结果regexp.exec(string)
.
当RegExp.prototype.exec
文档[MDN]说:
返回的数组将匹配的文本作为第一个项目,然后为匹配的每个捕获括号中的一个项目包含捕获的文本.
因此,当您在第二个表达式中引入捕获组时,第一个元素是整个匹配,第二个元素包含捕获组的内容,在您的示例中,它也是整个匹配.
第一个表达式没有捕获组,因此您只能返回匹配项.
回到match
文档:
如果正则表达式包含该
g
标志,则该方法返回包含所有匹配项的Array.如果没有匹配项,则返回该方法null
.
使用g
修饰符时,仅返回匹配项,但不返回捕获组的内容.在你的字符串中只有一个匹配.
该.match()
函数返回一个数组.document.write()
将数组打印为字符串.
当您在字符串中捕获一个组时,它会像这样生成一个数组:
Array(
[0] => 'the complete matched string',
[1] => 'the first captured group',
[2] => 'the second captured group',
[.] => '...'
)
Run Code Online (Sandbox Code Playgroud)
所以你的正则表达式变成了:
Array(
[0] => '.jpg', // You match .jpg of the string
[1] => '.jpg' // You captured the .jpg match
)
Run Code Online (Sandbox Code Playgroud)
如果你打印一个数组,它会,
在值之间放置一个.