2016-03-04 2 views
1

Я хотел бы получить только алфавит, но кода недостаточно, чтобы сделать это.Восстановить алфавит с пробелом

Что мне не хватает?

[A-Öa-ö]+$ 

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

Связано: [Соответствие первой ключевой буквы, за которой следует одна или несколько маленьких букв] (http://stackoverflow.com/questions/33986927/regex-matching-first-capital-letter-followed-by-one-or-more-small -letters/33987110 # 33987110) –

ответ

7

Это потому, что вы указываете последовательность из таблицы символов 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(); 
+0

Возможно, я использую это неправильно, но для последней строки я беру только «Орлеан», используя этот шаблон. Кроме того, как насчет пробелов, которые OP упоминает в «cityO»? –

+1

Данные являются "23941 cityO" – KLN

+1

@LarsKristensen: Исправлено. – jgauffin

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); 
    } 
} 
Смежные вопросы