2014-06-27 22 views
3

我已經嘗試使用正則表達式/^(\S+)(?:\?$|$)/正則表達式組包括:如果條件

yoloyolo?

作品既但第二個字符串(yolo?)的?將被包括在捕獲組(\S+)

這是一個正則表達式的錯誤,或者我犯了一些錯誤?

編輯:我不想那'''包括在捕獲組中。 Sry爲我的英語不好。

+1

你最想達到什麼目的? – sshashank124

+0

@AvinashRaj Sry對於下一次我會更好地解釋我的問題 – Keltere

+0

你是這個網站的新手,所以沒問題:-) –

回答

4

您可以使用

  • 如果你想捕捉不能有它?什麼,用一個否定的字符類[^...](見demo here):

    ^([^\s?]+)\??$ 
    
  • 如果要捕獲的內容可以包含?(例如,yolo?yolo?並且您想要 yolo?yolo),您需要通過添加?+lazy,讓您的量詞(見demo here):

    ^(\S+?)\??$ 
    
  • 有BTW沒有必要捕獲組在這裏,您可以使用look ahead(?=...)代替,並期待在整個比賽(見demo here):

    ^[^\s?]+(?=\??$) 
    

發生了什麼

規則是:量詞(如+)默認爲greedy,正則表達式引擎將返回它找到的第一個匹配。

慮這意味着什麼位置:

  • \S+將首先匹配yolo?一切,那麼發動機將嘗試匹配(?:\?$|$)
  • \?$失敗(我們已經在字符串的末尾,所以我們現在嘗試匹配一個空字符串,並且沒有?左側),但$匹配。

正則表達式已經成功地到達終點時,發動機將返回那裏\S+匹配了所有的字符串和一切是第一個捕獲組的比賽。

要匹配你想要什麼,你必須做量詞懶惰(+?),或阻止字符類(是的,\S是一個字符類)從符合結束符?(與[^\s?]爲例)。

+0

所以我不能使用+,任何解決方案? – Keltere

+0

@ Massimo1993:已編輯的答案在正在發生的事情上添加可能的解決方案:) – Robin

+0

Tnks很多,你已經非常詳盡 – Keltere

2

下面的正則表達式將捕獲所有的非空格字符後面的選項?

^([\S]+)\??$ 

DEMO

OR

^([\w]+)\??$ 

DEMO

如果使用\S+,它甚至匹配?個字符。所以要分開單詞和非單詞字符,你可以使用上面的正則表達式。它將僅捕獲單詞字符並匹配可選的?,後面跟有一個或多個單詞字符。

+0

海報不希望'?'在第一個捕獲組中,它與正則表達式,他提供了。 –

+0

我的錯我不想要?在第一個捕獲組斯里...... – Keltere

+0

@ Massimo1993更新。 –

2

這是正確的迴應,因爲\S+貪婪地匹配一個或多個非空白字符,其中?是一個。

這樣的問號是(\S+)組匹配和非捕獲組解析爲$你可以讓你通過使匹配非貪婪與期待它的工作:

/^(\S+?)(?:\?$|$)/ 

demo

另外,您可以限制字符組:

/^([^\s?]+)(?:\?$|$)/ 

demo

+0

Sry不起作用。無法識別字符串的結尾。 – Keltere

+0

它的工作原理,請參閱演示。 –

2

充分利用+非貪婪:

^(\S+?)\??$ 
2

它這樣做,因爲\S匹配任何非空白字符,它正在貪婪

+量詞與?non-greedy匹配將防止這種情況。

^(\S+?)\??$ 

或使用\w這裏匹配任何單詞字符。

^(\w+)\??$