2015-04-29 124 views
1

我正在开发一个程序,我需要过滤非拉丁字符的单词和句子。问题是,我发现只有拉丁字符的单词和句子,但我没有找到与拉丁字符和非拉丁字符混合的单词和句子。例如,“你好”是拉丁语字母的单词,我可以使用此代码匹配它:正则表达式拉丁字符过滤器和非拉丁字符过滤器

Match match = Regex.Match(line.Line, @"[^\u0000-\u007F]+", RegexOptions.IgnoreCase); 

if (match.Success) 
{ 
    line.Line = match.Groups[1].Value; 
} 

但我没有发现例如与非拉丁文字母的单词或句子的混合:“你好,我是财产以后” 。

此外,有人可以解释什么是RegexOptions.None或RegexOptions.IgnoreCase和他们的立场?

+1

我一直认为'àèéìòù'是拉丁文...... – xanatos

+0

而且正则表达式**不会**找到'Hello',因为它只能找到> 0x7F的字符,所以它会抛出一个'ø ' – xanatos

+0

@xanatos确实。 Unicode将è描述为拉丁文小写字母E WITH GRAVE。所以,BinaryTie,你想要包含还是排除这样的拉丁字符? –

回答

2

四个 “拉丁” 块(从http://www.fileformat.info/info/unicode/block/index.htm):

基本拉丁字母U + 0000 - U + 007F

拉丁语1补充U + 0080 - U + 00FF

拉丁语扩展A U + 0100 - U +拉丁文扩展-A

拉丁语扩展B U + 0180 - U +国际音标扩展

所以一个正则表达式“包含”所有的人都将是:

Regex.Match(line.Line, @"[\u0000-\u024F]+", RegexOptions.None); 

而正则表达式捕捉到任何外块是:

Regex.Match(line.Line, @"[^\u0000-\u024F]+", RegexOptions.None); 

请注意,我觉得做一个正则表达式“by block”有点不对,特别是当你使用拉丁块时,例如在基本拉丁块中,你有控制字符(如新行,...),字母(AZ,az),数字(0- 9),标点(。,;:...),其他字符($ @/& ...)等等。

对于RegexOptions.None的意义和RegexOptions.IgnoreCase

  • 他们的名字是很清楚

  • ,你可以尝试使用Google他们在MSDN

https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

RegexOptions.None:指定不设置任何选项

RegexOptions.IgnoreCase:指定不区分大小写的匹配。

最后一个就是说,如果你做Regex.Match(line.Line, @"ABC", RegexOptions.IgnoreCase)它将匹配ABCAbcabc,...而这个选项的作品甚至在字符范围像[A-Z]将同时匹配A-Za-z。请注意,在这种情况下它可能是无用的,因为我建议的块应包含大写和小写字母的大写和小写“变体”。