负前瞻行为不符合预期
Posted
技术标签:
【中文标题】负前瞻行为不符合预期【英文标题】:Negative lookahead doesn't behave as expected 【发布时间】:2019-02-08 08:42:37 【问题描述】:尝试使用正则表达式解析字符串中的参数:"-a 1 -b -5.1"
。
输出应该有 2 个带有值的标志:标志 a
带有值 1
,b
带有 -5.1
。
当我尝试(-(?<flag>[a-zA-Z])(?<value> .+)?(?!-[a-zA-Z]))*
正则表达式时,它只返回标志a
和值1 -b -5.1
。
为什么不停在-b
?
【问题讨论】:
为什么不拆分空间``(到"-a", "1", "-b", "-5.1"
)然后将偶数项视为名称而奇数项视为值?
@DmitryBychenko 只是猜测,值可能包含空格。
Tempered Greedy Token - What is different about placing the dot before the negative lookahead的可能重复
@DmitryBychenko 从 OP 对正则表达式的尝试来看,每当看到 -[a-zA-Z]
时,这将是一个新标志的开始。
@DmitryBychenko 在我的情况下,标志可能没有价值。这就是为什么连物品都行不通的原因。而且,正如@Sweeper 所说,-b
应该被视为新标志的开始。
【参考方案1】:
您需要让(?<value> .+)
变得懒惰,并将消极的前瞻变成积极的前瞻。
这是我的尝试:
-(?<flag>[a-zA-Z]) (?<value>.+?)(?=$| -[a-zA-Z])
Demo
解释:
您可能想知道为什么使用积极的前瞻而不是消极的前瞻。这是因为+?
将在匹配之后的事物时停止匹配。这就是为什么我们期待找到$| -[a-zA-Z]
,如果我们找到了,+?
就会停止匹配!
我还在value
组之外移动了一个空格字符。我假设您不希望该值包含空格?
【讨论】:
唯一的问题是它不适用于没有值的标志。例如,对于-a -b -c -d
,此正则表达式将返回 2 个匹配项:-a -b
-c -d
。虽然应该是-a
-b
-c
-d
-(?<flag>[a-zA-Z])( (?<value>.+?))??(?=$| -[a-zA-Z])
将正确解析没有值的标志
@RomanGudkov 对。你没有在问题中提到这一点,所以我没有注意到。那么问题现在解决了吗?
你说得对,我最初没有提到这一点 - 想保持简短。决定为可能有类似附加要求的人添加评论。现在解决了。以上是关于负前瞻行为不符合预期的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式前瞻(?=)后顾(?<)负前缀(?!)负后顾(?<!)