2017-06-15 60 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

相关问题