从不以其他字母开头的字符串中删除 2 个尾随字母的正则表达式

Regex that removes the 2 trailing letters from a string not preceded with other letters

这是在 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# 中,所以我总是 return 一个字符串,删除两个尾随字母(如果它们确实存在并且前面没有另一个字母)。

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

您的 @".*[a-zA-Z]{2}$" 正则表达式匹配除换行符(尽可能多)以外的任何 0+ 个字符和字符串末尾的 2 个 ASCII 字母。您不检查上下文,因此无论前面是什么,这 2 个字母都是匹配的。

您需要一个正则表达式来匹配前面没有字母的最后两个字母:

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

this regex demo

详情:

  • (?<!\p{L}) - 如果在当前位置之前找到字母 (\p{L}),则匹配失败(如果只想处理 ASCII 字母,可以使用 [a-zA-Z]
  • \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);

请记住,在正则表达式中,$ 表示输入的结尾或换行符之前的字符串。