当我期望匹配时,match() 返回包含两个匹配的数组

IT技术 javascript regex string match
2021-02-27 20:13:32

考虑以下示例:

<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>

结果如下:

.jpg
.jpg,.jpg
.jpg

我期待这个结果:

.jpg
.jpg
.jpg

为什么在正则表达式周围放置括号会改变结果?为什么使用 'g' 修饰符会再次改变结果?

2个回答

来自String.prototype.match [MDN]

如果正则表达式不包含该g标志,则返回与regexp.exec(string).

RegExp.prototype.exec文档[MDN]说:

返回的数组将匹配的文本作为第一项,然后是每个匹配的捕获括号的一项,其中包含捕获的文本。

因此,当您在第二个表达式中引入捕获组时,第一个元素是整个匹配项,第二个元素包含捕获组的内容,在您的示例中,它也是整个匹配项。
第一个表达式没有捕获组,因此您只能返回匹配项。

回到match文档:

如果正则表达式包含该g标志,则该方法返回一个包含所有匹配项的数组。如果没有匹配项,则该方法返回null

使用g修饰符,只返回匹配项,而不返回捕获组的内容。在您的字符串中只有一个匹配项。

.match()函数返回一个数组。document.write()将数组打印为字符串。

当您在字符串中捕获一个组时,它会生成一个如下所示的数组:

Array(
  [0] => 'the complete matched string',
  [1] => 'the first captured group',
  [2] => 'the second captured group', 
  [.] => '...'
)

所以你的正则表达式变成了:

Array(
  [0] => '.jpg', // You match .jpg of the string
  [1] => '.jpg' // You captured the .jpg match
)

如果你打印一个数组,它会,在值之间放置一个

答案是正确的,为了清楚起见:由于添加了括号,因此发生了小组赛。当您喜欢处理某些子匹配项时,这会很有帮助。例如,这是可能的:var pattOne = new RegExp('\.([^\.]*)$');比该组只包含没有点的文件扩展名。
2021-04-20 20:13:32
我看到一些 PHP 在那里戳了戳
2021-05-14 20:13:32