没有 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 后跟 -,因为我们使用的是负前瞻。

RegEx Demo 1

如果没有b-则先匹配-.

RexEx Demo 2