一道关于"/g"笔试题

正则里“g”表示全局(global)的意思,比如当替换字符串时,如果正则不加g,则只替换一次。

1
2
3
4
str = 'hello, jack, hello, lily';
reg = /hello/;
res = str.replace(reg, 'hi');
console.log(res); // 'hi, jack, hello, lily'

第二个hello未被替换,正则reg换成“/hello/g”后则全部替换。

 

“g”还有一个作用是它会记录上次匹配时的位置(lastIndex)。这道题如下

1
2
3
4
var reg = /abc/g;
var str = 'abcd';
reg.test(str);
reg.test(str);

两次test的结果分别是什么? 相信不少人会迷惑。

 

这种情况Perl里也会发生

1
2
3
4
5
6
7
8
9
10
11
12
13
use 5.012;
 
my $str = 'abcd';
if ($str =~ /abc/g) {
  say 'true';
} else {
  say 'false';
}
if ($str =~ /abc/g) {
  say 'true';
} else {
  say 'false';
}

 

对于不同的正则对象,JS中会从字符串重新开始,因此以下两次输出都是true。

1
2
3
4
5
reg1 = /ab/g;
reg2 = /cd/g;
str = 'abcd';
console.log(reg2.test(str));
console.log(reg1.test(str));

 

但Perl中第二次却是false,因为它记住了上次匹配的位置。从字符d后再去匹配ab就匹配不上了。

1
2
3
4
5
6
7
8
9
10
11
12
13
use 5.012;
 
my $str = 'abcd';
if ($str =~ /cd/g) {
    say 'true';
} else {
    say 'false';
}
if ($str =~ /ab/g) {
    say 'true';
} else {
    say 'false';
}

  

 

posted on   snandy  阅读(1244)  评论(1编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2012年11月 >
28 29 30 31 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 1
2 3 4 5 6 7 8

统计

点击右上角即可分享
微信分享提示