Регулярное выражение, которое удаляет 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);
Помните, что в регулярных выражениях $
означает конец ввода или строку перед новой строкой.