2016-10-22 196 views
-1

我用正則表達式正則表達式匹配的句子

(.*)(\s){1}([0-9]*min|lightning)\b 

匹配類似下面的字符串:

  1. 編寫快速測試針對企業的Rails 60分鐘

  2. 的Clojure吃斯卡拉(在我的項目上)45分鐘

  3. Acco unting驅動開發45分鐘

的匹配組會給:

  1. 編寫快速測試針對企業的Rails

  2. 空間

  3. 60分鐘

但是像???????????????????? 60min這樣的字符串也匹配。

任何人都可以幫我解決這個問題嗎?

更新

按照答案的正則表達式如下喜歡將解決這個問題,但對於輸入3

^([^XX]*)(\s){1}([0-9]*min|lightning)\b$ 
  1. 我想允許 - 使輸入3場比賽。串像,下面將 同時符合這是不正確

  2. 1組應該只包含字母

    ------------ 60分鐘

請參閱鏈接https://regex101.com/r/JH5sl1/6

+1

似乎其由ThoughtWorks的分配! – SMA

回答

0

更改(.*)(\s){1}([0-9]*min|lightning)\b^([\w ]*)(\s){1}([0-9]*min|lightning)\b$

它將確保您只匹配字符串開頭的字母數字和空格。請參閱demo

由於問題在演變,所以讓我們從另一個角度來考慮問題。您正則表達式更改爲:

^([^XX]*)(\s){1}([0-9]*min|lightning)\b$ 
    ^^^^^ 

,並更改XX,無論你不想匹配。它被稱爲否定字符類,並允許您「拒絕」其包含的字符。


如果你想避免兩個連續的非字母數字字符的存在,你可以使用負前瞻:

^(?!.*(\W)\1)(\D*)\s(\d*min|lightning)$ 

Demo

+0

nopes它給出 組1 -rils 組3-60分鐘 – coder25

+0

@ThomasAyoub這不匹配OPs第二個樣本字符串,因爲有括號。你可能會將它們包括到你的字符類中,但我猜它會隨着進一步的樣本增長越來越大。 –

+0

字符串會計驅動開發45分鐘 – coder25