2016-12-05 240 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

我保持它,因爲它可能有助於解析選項,其中沒有假設' - '或' - '標誌。 –