忽略表达式中的可选前缀
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
,因此如果您需要验证字符串的结构,则此正则表达式不够具体。
【讨论】:
我同意。这通过了显示的所有测试用例,并且不需要(各种支持的)环顾四周。 (我也打算这样回答,但蒂姆超过了我!)以上是关于忽略表达式中的可选前缀的主要内容,如果未能解决你的问题,请参考以下文章