检索带有空格的字母表

本文关键字:字母表 空格 检索 | 更新日期: 2023-09-27 18:37:15

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

我错过了什么?

[A-Öa-ö]+$
16440 dallas
23941 cityO     < You also have white space after "O"
931 00 Texas
10581 New Orleans

检索带有空格的字母表

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

你可以在这里看到它:http://www.asciitable.com/

因此,您需要的是一个分别指定这些的正则表达式:

[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 "

要解决此问题,您首先将正则表达式指定为 greedy,即告诉它使用更少的字符:

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;
        }
    }
}

调用方式如下:

var codes = GetCodes(yourData).ToList();

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

因此,您可以使用

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

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

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

查看正则表达式演示

C# 演示:

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);
    }
}