【问题标题】:Regex to find last character of string [duplicate]正则表达式查找字符串的最后一个字符[重复]
【发布时间】:2021-07-29 10:33:06
【问题描述】:

我想验证一个字符串

AB000A1B

BC222B2P

条件:

  • 字符串长度应大于 7
  • 前两个字符必须是字母
  • 索引 2,3,4 处的字符应为数值 // 0 based index
  • 字符串的最后一个字符应该是字母(仅限 B、P、J 中的任何一个)

我使用了以下代码,但它只能将前两个字符验证为字母,然后将 3 个字符净为数值,如何验证字符串的最后一个字符是否为 B、P、J 中的任何一个或如何我可以在所列条件下实现改进的模式吗?

if (inputString.Length > 7)
{
   string pattern = "^[a-zA-Z]{2}[0-9]{2}[B|P|J]$"; 
   Regex rgx = new Regex(pattern);
   if (rgx.IsMatch(inputString))
   {
    
   }
}

【问题讨论】:

  • 您指定了三个数字,但在您的模式中有 {2} 并且您在它们和最后一个字符之间没有任何内容,例如.* 匹配之间的字符。像regexstorm.net/tester 这样的在线正则表达式测试人员非常适合制作正则表达式原型。
  • 如果字符串长度为 10,前 2 个字符是 alpha,后 3 个是数字,最后一个字符是 B、P 或 J,这是否意味着其他字符可以是任何字符?
  • 这能回答你的问题吗? regex match last character

标签: c# regex


【解决方案1】:

你几乎就在那里 - 除了两个小错误。

string pattern = @"^[a-zA-Z]{2}[0-9]{3}.+[BPJ]$"

这应该是诀窍。说明:

  1. ^[a-zA-Z]{2} - 字符串的开头,后跟两个字母
  2. [0-9]{3} - 三个数字字符在位置 2,3,4(不是两个)
  3. .+ - 任意数量的字符,但至少一个 - 您没有为此部分指定任何限制。可能你想改用[a-zA-Z0-9]+
  4. [BPJ]$ - 大写字母 B、P 或 J,后跟字符串结尾。在您的版本中,AB000A1| 也会匹配。

由于部件的大小,长度要求是隐式执行的:2 + 3 + 1 或更多 + 1 = 7 或更多。

编辑

我将“大于 7”误读为“至少 7”。在这种情况下,模式必须是@"^[a-zA-Z]{2}[0-9]{3}.{2,}[BPJ]$",正如永顺指出的那样。

【讨论】:

  • 嗨@Franz,无论如何,您的解决方案仍然有效,因为在满足字符串长度时会发生正则表达式检查(通过if 语句)。无论如何,想给一个“大拇指”以提供可靠的解决方案和解释。 =)
  • @YongShun 好吧,你已经得到了我纠正错误的支持
  • 知道了,谢谢。 +1 解释,以便相关案例能够理解。
【解决方案2】:

作为@Franz 回答的延伸

要强制您的输入文本必须满足以下要求:

  • 前 2 个字符必须是字母
  • 接下来的 3 个字符必须是数字
  • 最后一个字符必须是 B 或 P 或 J
  • 输入字符串的长度必须超过 7 个字符

您可以应用下面的正则表达式:

string pattern = @"^[a-zA-Z]{2}[0-9]{3}.{2,}[BPJ]$";

.{2,} 表示匹配任何字符最少2次及以上

您的正则表达式组将由:

  1. 任何长度为:2的字母字符
  2. 长度为 3 的任意数字字符
  3. 最小长度的任何字符:2
  4. 最后一个字符必须是(B​​ 或 P 或 J),长度为:1

加上所有这些长度 (2 + 3 + 2 + 1 = 8 > 7)

一个有效的输入必须需要 8 个字符 + 满足上面的正则表达式组。

因此,不再需要您的 if 语句来检查字符串长度必须超过 7 个字符。

Regex & Sample test data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多