2016-12-21 82 views
1

我建立在斯威夫特正則表達式,需要檢查這些特定情況:正則表達式最多兩個運營商

匹配,如果發現:

AB*5+4 
AB+4*5 
AB+4 
AB*5 
AB 
AB+54.45 
AB+50.49*54 

不匹配,如果發現:

AB+4+5 
AB*4*5 
AB*0 

中只能有0-2個運營商(+*),但如果有兩個,他們可以是不一樣的。乘以0不應該匹配。

我建的正則表達式如下:

[A-Z]{2}(\+|\*)[1-9]{1,}(?:(?(?=\1)(\+|\\*))[1-9]{1,})? 

的主要問題是,我無法預知的條件捕獲的第一組中,所以我無法檢查是這樣的:如果在*首先被捕獲的組然後是+,反之亦然。

任何人都可以幫助我嗎?

+0

你想要應用什麼規則?從你提供的例子中不清楚。 –

+0

我不想重複+或重複*前。 AB + 4 + 5或AB * 4 * 5,我只能接受AB + 4,AB * 5,AB * 4 + 5,AB + 5 * 4 ...... – talesfromnowhere

+0

AB * 4 + 5 * 7 ?它只能是2個數字,還是允許更長的字符串? –

回答

1

您需要使用負前瞻((?!...)),像這樣:

[A-Z]{2}(\+|\*)\d+(?!\1)((\+|\*)\d+)? 

the docs解釋,負前向斷言是

True如果括號內的模式完全不匹配當前輸入位置。不要提前輸入位置。

上述匹配正則表達式:

  • [A-Z]{2} 2個字母
  • (\+|\*)要麼+*
  • \d+ 1或多個數字
  • (?!\1)不能被隨後在相同符號(+*)作爲第一個
  • ((\+|\*)\d+)?任意別的+*後面跟着一個或多個數字

Here's a demo是通過你作爲實例列出的所有情況,並在評論中相匹配的限制。

+0

這裏是[更新後的版本](https://regex101.com/r/YKmCpX/4/tests);正則表達式是[AZ] {2}(?:(\ + | \ *)[1-9] [\ d \。] *(?!\ 1)((\ + | \ *)[1-9 ] [\ d \] *))(\ + |???!\ *)'。額外的規則(只允許'AB',允許''',不包括'AB * 0')使得它更加複雜。將來,請確保您在問題本身中指定了所有約束條件。:) –

+0

對不起,Ed,我刪除了我以前的評論時發生了錯誤,我試圖更好地解釋我正在尋找,但無法編輯以前的評論,所以...我搞砸了。 – talesfromnowhere

+0

我還有最後一個問題,我詳細闡述了我的正則表達式,直到這裏:https://regex101.com/r/uzzSBL/2但我想捕獲的最後階段,也是隻收集沒有操作的名字。在上面的例子中,我想收集另一組(SOCCERCLUB,ZX,FP)..有沒有可能破壞任何東西? – talesfromnowhere