没有 g 标志 RegEX 返回有线输出

Posted

技术标签:

【中文标题】没有 g 标志 RegEX 返回有线输出【英文标题】:Without the g flag RegEX return wired output 【发布时间】:2021-09-26 06:43:39 【问题描述】:

正则表达式

m/(b?)-/ [here no g flag]

示例输入

a-b-

当前匹配

-

想要的匹配

b-

我的疑问是为什么没有全局标志 b- 不匹配

(b?) 可以选择匹配文字 b

"-" 匹配文字 -

最后,我只得到-这个?

$ echo "a-b-" | sed 's/\(b\?\)-/x\u\1/g'
axxB
$ 
$ echo "a-b-" | sed 's/\(b\?\)-/x\u\1/'
axb-

在最后一次 sed 替换中,- 的第一次出现被 x 替换,b-

【问题讨论】:

请在您的问题中添加适当的问题陈述。输入是什么?您要在该输入中匹配什么? 如果没有全局标志,正则表达式将只返回第一个匹配项。由于您的正则表达式是b?- 和可选的b,因此它首先从输入a-b- 返回-。当有全局标志时,它将返回 2 个匹配项 ['-', 'b-'] 嗨@TimBiegeleisen,我想使用“b?-”这个正则表达式匹配“b-”字符串。请看这个regex101.com/r/8GCQjr/1 请在您的问题中添加示例输入(无描述、无图像、无链接)和该示例输入所需的输出(无评论)。 @Cyrus 我会这样更新。 【参考方案1】:

如果没有全局标志,正则表达式将只返回第一个匹配项。由于您的正则表达式是b?- 和可选的b,因此它首先从输入a-b- 返回-

如果您仍然想匹配 b-,即使 - 先出现,那么您可以使用此正则表达式并带有负前瞻:

b?-(?!.*b-)

这将匹配可选的b,后跟-,前提是右侧没有b-,因为我们使用的是负前瞻。

RegEx Demo 1

如果没有b-,那么它将首先匹配-

RexEx Demo 2

【讨论】:

您现在可以看一下当前的问题吗? 是的,我已经这样做了,我的答案已经解决了这两种情况。让我知道哪种情况不包括在内? ?修饰符优先考虑字符的零次出现,对吧? b+- 会做正确的工作。我学到了一些东西。 是的b- 也可以完成这项工作,但它与x-y 中的- 不匹配 (b*)- 匹配 -b- [- 和 b-],正则表达式引擎中是否有任何反向遍历,b* 匹配任意数量的 b 并跟随“-”字符,但不知何故,b*前面的字符“-”也匹配了。

以上是关于没有 g 标志 RegEX 返回有线输出的主要内容,如果未能解决你的问题,请参考以下文章

在 Hive 中使用 Regex Serde 创建表返回错误

使用Regex将变量传递到document.getElementById

正则表达式无法与 C++ regex_match 一起按预期工作

JavaScript match()方法使用

为啥 Regex.Match 只返回 1 个结果?

使用 $regex 查询 mongoose 不返回任何结果