2014-07-17 11 views
1

免責聲明:我不認爲這是What's the regex to match anything except a double quote not preceded by a backslash?的重複,因爲OA有定界雙引號,他/她可以使用。如何匹配任何字符(包括特殊字符)的字符串,除了在較大的表達式中沒有前面加反斜槓的冒號?

我試圖匹配Java中的單個行字符串取入的僞代碼如下形式,其中[any!=:]是短期的「除了一個冒號任何字符至少一個未經前述反斜槓」。

[any!=:]::[any!=:]:[any!=:] 

我不擅長的正則表達式,但我檢查了負回顧後並紛紛拿出(不是Java,但常規的正則表達式):

[^(?<!\\):]+:{2}[^(?<!\\):]+:[^(?<!\\):]+ 

這確實匹配類似

(1)asd::asd:asd

但確實的比賽,例如,

(2)asd\:asd::asd\:asd:ads\:asd(然而,它應該)。

accepted answer來解決上面提到的問題,我也嘗試了以下方法。

([^(?<!\\):]|\\:)+:{2}([^(?<!\\):]|\\:)+:([^(?<!\\):]|\\:)+ 

這適用於(2),對於一些但不是所有特殊字符(根據RegexPlanet)。它在[c]::[c]:[c]的組合中使用的字符[c]例如是$,",%,&,/,+。它的作用是而不是適用於例如?,!,),\

Wikipedia

通常的元字符{}^$ | *。+?和。

爲什麼然後我的正則表達式爲一些元字符(因爲他們顯然被稱爲)工作,但不是其他人?我怎樣才能「修復」我的正則表達式來考慮那些不起作用的東西?

+0

要匹配任意字符,除了冒號沒有反斜槓,我使用的這個表達式(http://regex101.com/r/hP8sG2/1) – RevanProdigalKnight

+0

@RevanProdigalKnight如果一個字符串以'\:'開頭(不確定OP是否需要這樣做)。 – Sam

+0

@Sam Well ....那時我很茫然。 – RevanProdigalKnight

回答

1

如何使用這樣的:

(?:\\:|[^:])+:{2}(?:\\:|[^:])+:(?:\\:|[^:])+ 

Demo(我用^$錨演示)


需要解釋的唯一部分是「除外的任何字符的邏輯冒號(除非前面加反斜槓)「:(?:\\:|[^:])+。讓我們打破下來:

(?:  # start non-capturing group 
    \\  # match \ literally 
    :  # match : literally 
|  # OR 
    [^:] # match anything but : 
)+  # repeat non-capturing group 1+ times 

差不多,我們尋找一個字符時間(非捕獲組),重複這個邏輯1+倍。此字符可以是\:或任何其他字符,但可以是:[^:])。請注意,\\:必須是您的第一個交替,否則[^:]將匹配反斜槓,這可能是逃脫冒號所必需的。


更新:爲什麼不([^(?<!\\):]|\\:)+工作?

簡而言之,lookaround在字符類中不做任何事情。因此,讓我們打破這一輪下來:

(   # start capturing group 
    [^(?<!\\):] # match anything but (, <, !, \, or : 
|   # OR 
    \\   # match \ literally 
    :   # match : literally 
)+   # repeat capturing group 1+ times 
+0

很好的答案,謝謝,並且很快!但我不明白爲什麼我的一半解決方案對一些但不是所有的元字符都有效......(請注意:需要了解非捕獲組)。 –

+0

查看我的最新資訊@ s.d ... – Sam

+1

把它放在我的面前做了訣竅:)。我現在明白了。 –

相關問題