没有 g 标志 RegEX return 有线输出
Without the g flag RegEX return wired output
正则表达式
m/(b?)-/ [here no g flag]
示例输入
a-b-
当前匹配
-
所需匹配
b-
我的疑问是为什么没有全局标志 b-
不匹配
(b?) is optionally matching literal b
"-" is matched literal -
最后只得到-
这一个?
$ echo "a-b-" | sed 's/\(b\?\)-/x\u/g'
axxB
$
$ echo "a-b-" | sed 's/\(b\?\)-/x\u/'
axb-
在最后一次 sed 替换中,第一次出现的 -
被 x 替换了 b-
没有全局标志,正则表达式将 return 只匹配第一个。由于您的正则表达式是 b?-
和可选的 b
因此它 return 是第一个 -
来自输入 a-b-
.
如果您仍然想匹配 b-
,即使 -
先出现,那么您可以使用此正则表达式进行否定前瞻:
b?-(?!.*b-)
只有在右侧没有 b-
时才会匹配可选的 b
后跟 -
,因为我们使用的是负前瞻。
如果没有b-
则先匹配-
.
正则表达式
m/(b?)-/ [here no g flag]
示例输入
a-b-
当前匹配
-
所需匹配
b-
我的疑问是为什么没有全局标志 b-
不匹配
(b?) is optionally matching literal b
"-" is matched literal -
最后只得到-
这一个?
$ echo "a-b-" | sed 's/\(b\?\)-/x\u/g'
axxB
$
$ echo "a-b-" | sed 's/\(b\?\)-/x\u/'
axb-
在最后一次 sed 替换中,第一次出现的 -
被 x 替换了 b-
没有全局标志,正则表达式将 return 只匹配第一个。由于您的正则表达式是 b?-
和可选的 b
因此它 return 是第一个 -
来自输入 a-b-
.
如果您仍然想匹配 b-
,即使 -
先出现,那么您可以使用此正则表达式进行否定前瞻:
b?-(?!.*b-)
只有在右侧没有 b-
时才会匹配可选的 b
后跟 -
,因为我们使用的是负前瞻。
如果没有b-
则先匹配-
.