C# 用空格检索字母表

C# 用空格检索字母表,c#,regex,C#,Regex,我只想检索字母表,但代码不足以检索 我错过了什么 [A-Öa-ö]+$ 16440 dallas 23941 cityO < You also have white space after "O" 931 00 Texas 10581 New Orleans 这是因为您从ASCII字符表中指定了一个序列。在ascii表中,åäö不直接在Z之后 你可以在这里看到: 因此,您需要一个单独指定这些内容的正则表达式: [A-Za-zåäöÅÄÖ]+$ 因此,完整的正则表达式是: va

我只想检索字母表,但代码不足以检索

我错过了什么

[A-Öa-ö]+$

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

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

你可以在这里看到:

因此,您需要一个单独指定这些内容的正则表达式:

[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)
问题是,除了新奥尔良,它不需要其他线路。别问我为什么。为了解决这个问题,我告诉正则表达式,数字和文本之间必须有一个空格,并且文本后面可能有一个空格:

var re = new Regex("\\s([A-Za-zåäöÅÄÖ ]+?)[\\s]*$", RegexOptions.Multiline);
这适用于所有线路

正则表达式细分:

\\这是一个不应包含在匹配中的空白,因为它不在括号表达式中 [A-Za-zåääÅä]+? 查找字母表或空格中的字符 +必须有一个或多个 ? 使用贪婪搜索。 [\\s]* [\\s]查找空白字符 *如果是,则必须有零个或多个 另类

作为regex的替代方案,您可以执行以下操作:

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

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

你可以在这里看到:

因此,您需要一个单独指定这些内容的正则表达式:

[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)
问题是,除了新奥尔良,它不需要其他线路。别问我为什么。为了解决这个问题,我告诉正则表达式,数字和文本之间必须有一个空格,并且文本后面可能有一个空格:

var re = new Regex("\\s([A-Za-zåäöÅÄÖ ]+?)[\\s]*$", RegexOptions.Multiline);
这适用于所有线路

正则表达式细分:

\\这是一个不应包含在匹配中的空白,因为它不在括号表达式中 [A-Za-zåääÅä]+? 查找字母表或空格中的字符 +必须有一个或多个 ? 使用贪婪搜索。 [\\s]* [\\s]查找空白字符 *如果是,则必须有零个或多个 另类

作为regex的替代方案,您可以执行以下操作:

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;
        }
    }
}
在C中,您可以使用\p{L}Unicode类别来匹配所有Unicode字符。您可以将零个或多个空白字符与\s*匹配。字符串的结尾是$or\Z或\Z。您需要的单词可以被捕获,并且可以通过从匹配结果中轻松检索此捕获

因此,您可以使用

(\p{L}+)\s*$
或者-如果您计划匹配特定的芬兰语字母等:

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

:

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

因此,您可以使用

(\p{L}+)\s*$
或者-如果您计划匹配特定的芬兰语字母等:

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

:


也许我用错了,但在最后一行,我只是用这个模式捕捉奥尔良。还有,OP在cityO上提到的空格呢?数据是23941 cityO@LarsKristensen:Fixed@jgauffin哇!自从我第一次看到你的答案后,你的答案肯定扩大了!很好的解释:+1@KLN当前位置你对答案满意吗?或者你需要详细说明吗?也许我用错了,但在最后一行,我只是用这个模式捕捉奥尔良。还有,OP在cityO上提到的空格呢?数据是23941 cityO@LarsKristensen:Fixed@jgauffin哇!自从我第一次看到你的答案后,你的答案肯定扩大了!很好的解释:+1@KLN当前位置你对答案满意吗?或者你需要详细说明吗?相关:相关: