Я хотел бы получить только алфавит, но кода недостаточно, чтобы сделать это.Восстановить алфавит с пробелом
Что мне не хватает?
[A-Öa-ö]+$
16440 dallas
23941 cityO < You also have white space after "O"
931 00 Texas
10581 New Orleans
Я хотел бы получить только алфавит, но кода недостаточно, чтобы сделать это.Восстановить алфавит с пробелом
Что мне не хватает?
[A-Öa-ö]+$
16440 dallas
23941 cityO < You also have white space after "O"
931 00 Texas
10581 New Orleans
Это потому, что вы указываете последовательность из таблицы символов ASCII. И åäö не находится непосредственно после Z в таблице ascii.
Вы можете увидеть здесь: 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 "
Чтобы исправить, что вы начинаете, указав регулярное выражение, как жадный, то есть сказать ему, чтобы использовать меньше символов:
new Regex("([A-Za-zåäöÅÄÖ ]+?)$", RegexOptions.Multiline)
Проблема в том, что она не принимает другие строки, чем New orleans
. Не спрашивай меня, почему. Чтобы исправить это, я сказал, что регулярное выражение должно иметь место между цифрами и текстом, и что может быть пробел после текста:
var re = new Regex("\\s([A-Za-zåäöÅÄÖ ]+?)[\\s]*$", RegexOptions.Multiline);
, который работает со всеми линиями. Разбивка
Regex:
\\s
Один пробельные (который не должен быть включен в матче, так как это не в выражении скобка)([A-Za-zåäöÅÄÖ ]+?)
+
должно быть одного или более?
использование жадный поиск.[\\s]*
[\\s]
Найти белый символ пробела*
Там должна быть равна нулю или больше, если этоAlternative
В качестве альтернативы 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;
}
}
}
который вызывается как:
var codes = GetCodes(yourData).ToList();
В C#, вы можете использовать \p{L}
Unicode класс категории, чтобы соответствовать все символы Unicode. Вы можете совместить нулевые или более пробельные символы с \s*
. Конец строки - $
(или \Z
или \z
). Слово, которое вам нужно, может быть захвачено, и этот захват можно легко получить из результата матча через GroupCollection
.
Таким образом, вы можете использовать
(\p{L}+)\s*$
или - если вы планируете, чтобы соответствовать конкретным финским и т.д. буквы:
(?i)([A-ZÅÄÖ]+)\s*$
См regex 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);
}
}
Связано: [Соответствие первой ключевой буквы, за которой следует одна или несколько маленьких букв] (http://stackoverflow.com/questions/33986927/regex-matching-first-capital-letter-followed-by-one-or-more-small -letters/33987110 # 33987110) –