检索与白色空间的字母表

时间:2016-03-04 07:05:30

标签: c# regex

我想只检索字母,但代码不足以制作它。

我错过了什么?

[A-Öa-ö]+$

16440 dallas
23941 cityO     < You also have white space after "O"
931 00 Texas
10581 New Orleans

2 个答案:

答案 0 :(得分:7)

这是因为您从ASCII字符表中指定了一个序列。并且åäö不是直接在ascii表中的Z之后。

您可以在此处查看:http://www.asciitable.com/

所以你需要的是一个正则表达式,分别指定:

Num a => [a] -> [a] -> Double

所以完整的正则表达式是:

[A-Za-zåäöÅÄÖ]+$

但是,由于您希望允许名称中的空格(对于“新奥尔良”),您需要允许它,只需将其包含在正则表达式中:

var re = new Regex("([A-Za-zåäöÅÄÖ]+)$", RegexOptions.Multiline);
var matches = re.Matches(data);
Console.WriteLine(matches[0].Groups[1].Value);

不幸的是,在开头和结尾还包括空格:

var re = new Regex("([A-Za-zåäöÅÄÖ ]+)$", RegexOptions.Multiline);

要解决这个问题,首先要将正则表达式指定为贪婪,即告诉它使用较少的字符:

" New Orleans "

问题在于它不会使用除new Regex("([A-Za-zåäöÅÄÖ ]+?)$", RegexOptions.Multiline) 之外的其他行。不要问我为什么。为了解决这个问题,我告诉正则表达式,它必须在数字和文本之间留有空格,并且文本后面可能有空格:

New orleans

适用于所有行。

正则表达式细分:

  • var re = new Regex("\\s([A-Za-zåäöÅÄÖ ]+?)[\\s]*$", RegexOptions.Multiline); 单个空格(由于它不在括号表达式中,因此不应包括在匹配中)
  • \\s
    • 找到字母或空格中的字符
    • ([A-Za-zåäöÅÄÖ ]+?)必须有一个或多个
    • +使用贪婪搜索。
  • ?
    • [\\s]*查找空格字符
    • [\\s]如果
    • 必须为零或更多

<强>替代

作为正则表达式的替代方法,您可以执行以下操作:

*

调用方式如下:

public IEnumerable<string> GetCodes(string data)
{
    var lines = data.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
    foreach (var line in lines)
    {
        for (var i = 0; i < line.Length; i++)
        {
            if (!char.IsLetter(line[i]))
                continue;

            var text = line.Substring(i).TrimEnd(' ');
            yield return text;
            break;
        }
    }
}

答案 1 :(得分:0)

在C#中,您可以使用\p{L} Unicode类别类来匹配所有Unicode字符。您可以将零个或多个空格字符与\s*匹配。字符串结尾为$(或\Z\z)。您需要的单词可以捕获,并且可以通过 GroupCollection 轻松地从匹配结果中检索此捕获。

因此,您可以使用

(\p{L}+)\s*$

或 - 如果您打算匹配特定的芬兰语等字母:

(?i)([A-ZÅÄÖ]+)\s*$

请参阅regex demo

C# demo

var strs = new string[] {"16440 dallas", "23941 cityO     ", "931 00 Texas", "10581 New Orleans"};
foreach (var s in strs) {
    var match = Regex.Match(s, @"(\p{L}+)\s*$");
    if (match.Success)
    {
        Console.WriteLine(match.Groups[1].Value);
    }
}