2017-10-05 70 views
0

我在看別人的正則表達式......我可以弄清楚我正在處理積極的lookbehind,但我不確定它應該匹配什麼:(?<=[^])\t{2,}|(?<=[>])C#regex中的[^]匹配是什麼?

我知道當中小號ü˚F[stuff]匹配任何字符。我知道[^stuff]匹配任何字符不是其中。

[^]是什麼意思?我想這可能意味着「任何不是長度爲零的東西」,即「任何東西」。但是爲什麼不只是在簡單的.表達式上使用一些擴展(以捕獲換行符)呢?

更新:

每Wikter的評論,[^]單獨無效。但是,這仍然讓我想知道這件事情是應該做的......

對我來說,直觀的閱讀是...

(?<=[^]) - 向後看,無論什麼[^]比賽

\t{2,} - 然後找到兩個或兩個以上選項卡

| - 如果不是對於比賽......

(?<=[>]) - ...看看後面的>字符。

我的翻譯在哪裏缺少標記?

+0

與ECMAScript以外的大部分正則表達式類似,這是一種無效模式。它會拋出*'Unterminated [] set' *異常。要匹配任何字符,可以使用'(?s:。)'(''.'模式和'RegexOptions.Singleline'選項)。 –

+0

@WiktorStribiżew謝謝,你是對的,我給的表達不會編譯。我從源regex添加了更多的上下文:'(?<= [^])\ t {2,} |(?<=[>])''。 – mac9416

+1

是的,所以「C#regex中的[^]匹配是什麼?」它不匹配任何東西,因爲它是無效的模式。它甚至沒有嘗試,它在解析階段失敗。而'[^>]'是一個否定的字符類,匹配任何字符,但匹配'>'。 –

回答

3

[^]不匹配任何內容,因爲它是無效模式。它甚至沒有嘗試,它在解析階段失敗。另一方面,[^>]是一個否定字符類,它匹配任何字符但是>

[^]在除ECMAScript以外的大部分正則表達式中都是無效模式。它會在.NET中拋出Unterminated [] set異常。

要匹配任何字符,請使用(?s:.).模式和RegexOptions.Singleline選項)。

(?<=[^])\t{2,}|(?<=[>])圖案表示匹配立即前面有[^])\t{2,}|(?<=[>]圖案的位置,這是一個否定的字符類匹配任何單個字符但]),製表符,{2,}單個正回顧後發,|,(,?,<,=, [,>。從[^到最後]的所有字符都是「否定的」,因爲^之後的第一個]被視爲字面]符號。

你可以看到它匹配S後位置regex demo here

enter image description here

基本上,你需要時刻注意的是沒有字字符的字符,併發揮它的安全,你可以逃避所有非字詞的字符。

在字符類,只有4個字符是「特殊」:

^ 
] 
\ 
- 

如果你想避免誤解,總是逃避它們。

如果你希望你的老闆/客戶面前炫耀,請注意您不必如果逃脫他們...

  • -:如果它出現在字符類的結尾/開始,或字符與有效範圍/速記字符類之間,並且如果它不是字符類減法構造的一部分
  • ]:如果它出現在字符類的開頭並且它不是字符類中唯一的字符字符類
  • ^ - 如果它不是第一個字符積極的角色類。

而且\必須總是進行轉義。

+1

你在哪裏看到[^>]在給定的模式?如果你正在談論一個恰好包含>的單個字符類,請這麼說。 – BoltClock

+1

@BoltClock它在[評論](https://stackoverflow.com/questions/46588130/what-does-match-in-c-sharp-regex/46588503#comment80129827_46588130)。其實,我只是想提供一個有效的簡單否定字符類的例子。 –

+1

@WiktorStribiżew我認爲你在看['>]'而不是'[^>]'。 – mac9416