2017-06-15 54 views
3

下返回trueC#System.RegEx匹配LF時,它不應該

Regex.IsMatch("FooBar\n", "^([A-Z]([a-z][A-Z]?)+)$"); 

也是如此

Regex.IsMatch("FooBar\n", "^[A-Z]([a-z][A-Z]?)+$"); 

正則表達式是單線模式在默認情況下,所以$不應該匹配\ n。 \ n不是允許的字符。

這是爲了匹配單個ASCII PascalCaseWord(是的,它會匹配尾蓋)

不能與RegexOptions.Multiline的任何組合的工作| RegexOptions.Singleline

我在做什麼錯?

+3

在Windows上一個新行\ r \ N,沒有的\ n。 – Gusman

+0

是的,但.NET的RegEx實現與它匹配。出於某種奇怪的原因,查看文檔。 – CodeScrubber

+0

是的,你說得對,它將\ n視爲換行符,所以正則表達式僅檢查「FooBar」,這就是匹配的原因。不知道爲什麼它將\ n視爲新行,可能會添加與其他操作系統的兼容性... – Gusman

回答

1

.NET的正則表達式,所述$錨(如在PCRE,Python和PCRE,Perl中,但不的JavaScript)線的末端相匹配,或在最終換行符("\n")字符之前的位置字符串

參見this documentation

  $    的匹配必須在字符串或行的末尾發生在串或行的末尾,或前\n。有關更多信息,請參閱End of String or Line

沒有修改可以在.NET正則表達式重新定義這個(PCRE中,你可以使用DPCRE_DOLLAR_ENDONLY修改)。

您必須尋找\z主播:它只在字符串的盡頭匹配:

\z      比賽必須出現在只有字符串的結尾。有關更多信息,請參閱End of String Only

一個short test in C#

Console.WriteLine(Regex.IsMatch("FooBar\n", @"^[A-Z]([a-z][A-Z]?)+$")); // => True 
Console.WriteLine(Regex.IsMatch("FooBar\n", @"^[A-Z]([a-z][A-Z]?)+\z")); // => False 
+1

請投票解答。當我發佈我的答案時,我沒有看到這個。再次感謝Wiktor – CodeScrubber

1

維基百科:

$匹配輸入字符串或只是一個字符串結尾的新行前的位置的結束位置。在基於行的工具中,它匹配任何行的結束位置。

所以你問的是在字符串的開始位置後面是否有大寫字母,後面是任意次數(零個或一個字母),後面跟着字符串的結尾或位置就在換行符之前。

這一切似乎都是如此。

是的,似乎有什麼被認爲是換行不同的文檔來源之間有一些不匹配,以及$如何工作或應該如何工作。它總是讓人想起智慧:

有時候一個人有問題,他認爲他會用正則表達式來解決它。
現在這個人有兩個問題。

+0

不,不應該,在Windows上一個新行必須是\ r \ n,而不是\ n,因此行上的最後一個字符是\ n – Gusman

+0

@Gusman'Regex.IsMatch(「FooBar \ n \ n」, 「^ [AZ]([az] [AZ]?)+ $」,RegexOptions.Singleline)'(兩條換行符)返回false。使用MultiLine,它會返回true。我認爲他是對的。 IIRC將純''\ n''作爲一個換行符對待UNIX,是MS-land中的一個古老約定。在C中,你會將'\ n'寫入以文本模式打開的'FILE *',它實際上將'\ r \ n'寫入文件。它是一個文件中的\ r \ n,但在一個緩衝區中它可以是\ n。 –

+0

@EdPlunkett是的,他是對的,但不應該是對的,這就是我的意思是XD。問題是「新行」的定義,在窗口上「新行」是CR + LF,但正則表達式將LF視爲「新行」,如* nix – Gusman

相關問題