【问题标题】:Regex that removes the 2 trailing letters from a string not preceded with other letters从前面没有其他字母的字符串中删除 2 个尾随字母的正则表达式
【发布时间】:2016-12-02 18:02:30
【问题描述】:

这是在 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;

【问题讨论】:

  • “AB”的输出应该是什么?
  • @dotctor:这似乎无关紧要,因为可以在运行正则表达式之前使用mystring.Length 检查字符串长度。

标签: c# regex letter trailing


【解决方案1】:

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

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

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

this regex demo

详情

  • (?&lt;!\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);

【讨论】:

  • 对表达方式进行分解会很好,而不是仅仅对一个如此具体以至于对其他人没有任何用处的问题提供一个勺子式的答案
  • 不知道你所说的勺子喂养的答案是什么意思,OP 提供了一个使用的正则表达式 OP。我正在为 100% 的答案添加解释,请在个人资料中查看我的答案。
  • @Wiktor Stribiżew 谢谢!作为一种魅力。测试用例:“132456AC”,ExpectedResult = “132456”)“132456ACV”,ExpectedResult = “132456ACV”)“ABC2D2DD”,ExpectedResult = “ABC2D2”)“123456”,ExpectedResult = “123456”)“1234AB”,ExpectedResult = “ 1234") "1234A", ExpectedResult = "1234A")
  • 太好了,我编辑了这个问题,以免听起来有误导性。
【解决方案2】:

如果您想删除最后两个字母,您可以这样做:

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

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

【讨论】:

  • 再一次,这个[A-Za-z]{2}$ 不考虑最后两个字母之前的内容。至于 或换行符之前的字符串 - 不是你的情况,因为你没有使用 RegexOptions.Multiline 标志。
  • 它不需要基于我理解的问题。 @exevio 只想删除字符串的最后两个字符(如果它们是字母)。无需处理不匹配的内容,因为我们不会替换任何内容,并且除非我完全误读了某些内容,否则最后 2 个是否是字母也不会改变。
  • 参见 123456BVC --> 123456BVC(保持不变)Your regex保持不变
  • 啊。这与“我总是在返回一个字符串时删除两个尾随字母(如果它们确实存在)”的另一条语句相矛盾。如果他需要,您的回溯解决方案显然是正确的,但我将把它留在这里,以防它是一揽子删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2022-10-12
  • 1970-01-01
  • 2012-01-10
  • 2016-07-21
  • 2022-12-04
  • 2011-09-12
相关资源
最近更新 更多