Регулярное выражение, которое удаляет 2 завершающие буквы из строки, которой не предшествуют другие буквы

Это в C#. Я бился головой, но пока не повезло.

Так например

123456BVC --> 123456BVC (keep the same)
123456BV --> 123456 (remove trailing letters) 
12345V -- > 12345V (keep the same)
12345 --> 12345 (keep the same)
ABC123AB --> ABC123 (remove trailing letters) 

Это может начаться с чего угодно.

я пробовал @".*[a-zA-Z]{2}$" но не повезло

Это в C#, поэтому я всегда возвращаю строку, удаляющую две завершающие буквы, если они существуют и перед ними не стоит другая буква.

Match result = Regex.Match(mystring, pattern);
return result.Value;

2 ответа

Решение

Ваш @".*[a-zA-Z]{2}$" регулярное выражение сопоставляет любые 0+ символов, кроме новой строки (как можно больше) и 2 букв ASCII в конце строки. Вы не проверяете контекст, поэтому 2 буквы совпадают независимо от того, что стоит перед ними.

Вам нужно регулярное выражение, которое будет соответствовать двум последним буквам, которым не предшествует буква:

(?<!\p{L})\p{L}{2}$

Смотрите это регулярное выражение.

Детали:

  • (?<!\p{L}) - не соответствует, если письмо (\p{L}) находится до текущей позиции (вы можете использовать [a-zA-Z] если вы хотите иметь дело только с ASCII буквами)
  • \p{L}{2} - 2 буквы
  • $ конец строки.

В C# используйте

var result = Regex.Replace(mystring, @"(?<!\p{L})\p{L}{2}$", string.Empty);

Если вы хотите удалить эти последние две буквы, вы можете просто сделать это:

string result = Regex.Replace(originalString, @"[A-Za-z]{2}$", string.Empty);

Помните, что в регулярных выражениях $ означает конец ввода или строку перед новой строкой.

Другие вопросы по тегам