【问题标题】:Regex Latin characters filter and non latin character filer正则表达式拉丁字符过滤器和非拉丁字符过滤器
【发布时间】:2015-07-09 00:15:47
【问题描述】:

我正在开发一个程序,我需要过滤非拉丁字符的单词和句子。问题是,我只找到了拉丁字符的单词和句子,但我没有找到混合了拉丁字符和非拉丁字符的单词和句子。例如,“Hello”是拉丁字母单词,我可以使用以下代码匹配它:

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

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

但我没有发现例如与非拉丁字母词或句子混合的例子:“Hellø I am sømthing”。

另外,有人能解释一下 RegexOptions.None 或 RegexOptions.IgnoreCase 是什么以及它们代表什么吗?

【问题讨论】:

  • 我一直认为àèéìòù 是拉丁语...
  • 而那个正则表达式不会找到Hello,因为它只会找到> 0x7F的字符,所以它会很好ø
  • @xanatos 确实如此。 Unicode 将 è 描述为带有 GRAVE 的拉丁小写字母 E。那么,BinaryTie,您是要包含还是排除此类拉丁字符?
  • @TomBlodget 。是的,我希望它包含非拉丁字符。我只需要过滤所有单词中包含非拉丁字符的单词。只能是非拉丁字符,也可以是拉丁字符与非拉丁字符的混合。

标签: c# regex ascii non-ascii-characters


【解决方案1】:

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

基本拉丁语 U+0000 - U+007F

Latin-1 补充 U+0080 - U+00FF

拉丁扩展-A U+0100 - U+017F

拉丁扩展-B U+0180 - U+024F

因此,“包含”所有这些的正则表达式将是:

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

而一个正则表达式来捕捉块外的任何东西是:

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

请注意,我确实觉得“按块”执行正则表达式有点错误,尤其是当您使用拉丁块时,因为例如在基本拉丁块中,您有控制字符(如换行符,...) 、字母(AZ、az)、数字(0-9)、标点符号(.,;:...)、其他字符($@/&...)等等。

对于RegexOptions.NoneRegexOptions.IgnoreCase的含义

  • 他们的名字很清楚

  • 您可以尝试在 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]这样的字符范围,它将同时匹配@987654332 @ 和 a-z。请注意,在这种情况下它可能没有用,因为我建议的块应该包含大写和小写字母的大写和小写“变体”。

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2016-05-13
    • 2018-10-13
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多