2016-12-05 235 views
2

我想查找以一个或多个破折号(' - '或' - ')开头的字符串。MATLAB正则表达式;如何找到1或2个重复字符

>> Strs = {'nope', '-yes', '--yesAgain', 'not-this-one', '---notThisOneEither'}; 
>> regexp(Strs, '^-{1,2}') 
ans = 
    [] [1] [1] [] [1] 

为什么我的正则表达式为最终测试字符串返回1?根据正则表达式文档expr {m,n}“匹配表达式,当它发生在m次,但不超过n次连续”时,所以“ - {1,2}”应该找到"-""--"的实例,但应该忽略"---"的实例。我错过了什么吗?

回答

2

你的正则表达式发现部分比赛。为了避免这种情况,如果在1或2连字符后面有更多连字符,则需要明确告诉正则表达式引擎无法匹配。

所以,你可以在彭定康的末尾使用负前瞻

^-{1,2}(?!-) 

regex demo

由于(?!-)先行是零宽度断言,它会允许匹配---字符串。

+1

太棒了。谢谢你的解释。 – EddyTheB

1

如下您可以更改正则表达式:

regexp(Strs, '^-{1,2}[^-]') 

如果说,后一个或两个减号,没有更多的弊。

+0

仅供参考,'^ - {1,2} [^ - ]'正则表达式不匹配'--'和'-'字符串。 –

+0

@WiktorStribiżew,你是对的。谢谢。解决方案更好。 –

+0

我保持它,因为它可能有助于解析选项,其中没有假设' - '或' - '标志。 –