忽略表达式中的可选前缀

Posted

技术标签:

【中文标题】忽略表达式中的可选前缀【英文标题】:Ignore an optional prefix in expression 【发布时间】:2015-02-09 09:45:59 【问题描述】:

如何在可选前缀之后获取字符串?示例:

Expression    Result
------------------------
[asdf]xxx  => xxx
[foo]bar   => bar
[]bla      => bla
test       => test

[...] 是可选部分。

显然,我需要一个环视断言。但我不知道让它成为可选的。

【问题讨论】:

\[.*?\](.*),第一组是你想要的,实现取决于你的语言 @MarounMaroun:这不会使 [...] 成为可选的... 您使用的是哪个正则表达式引擎?大多数引擎不完全支持环视。 对不起。更新了我的帖子以使其更准确。 @TimPietzcker 错过了可选部分。 【参考方案1】:

这是对@Maroun 正则表达式的修改,使[...] 成为可选:

(?:\[.*?\])?(.+)

https://regex101.com/r/hM2sK8/1

注意我是如何将第一部分放在一个非捕获组中,并在组后使用? 使其成为可选。

【讨论】:

【参考方案2】:
(?:\[[^\]]*\]\K)?.+$

你可以试试这个。查看演示。

https://regex101.com/r/wX9fR1/14

\[[^\]]*\](*SKIP)(*F)|.+$

查看演示。

https://regex101.com/r/wX9fR1/15

【讨论】:

仍然捕获[]之间的部分 @funkwurm 现在没有 @vks [[^\]]*\] 我对此感到困惑?这种输出很容易通过(?:\[.*\]\K)?.+ 获得。你能解释一下[[^\]]*\]这部分代码吗?主要是我对代码中的 ^ 字符感到困惑? @Hussain \[.*\] 将抓取到最后一个]。因此,如果有多个[],那么它会抓取到最后一个]。所以我们使用否定的] 技术,它声明捕获aythingg 从[ 开始直到找不到] 字符,即[^\]] @vks 谢谢你的回复。【参考方案3】:

最简单的方法是使用

[^\[\]]*$

匹配除括号之外的任意数量的字符,直到字符串结尾。不过,它也会匹配][]sd[][xxx 中的xxx,因此如果您需要验证字符串的结构,则此正则表达式不够具体。

【讨论】:

我同意。这通过了显示的所有测试用例,并且不需要(各种支持的)环顾四周。 (我也打算这样回答,但蒂姆超过了我!)

以上是关于忽略表达式中的可选前缀的主要内容,如果未能解决你的问题,请参考以下文章

匹配所有出现的可选前缀/后缀[重复]

匹配正则表达式中的可选斜杠

使用正则表达式匹配日志文件行时的可选字段

ES11中的可选链等语法

ES11中的可选链等语法

Jax-RS 中的可选 @PathParam