【问题标题】:Need help to build regular expression to match a specific string (example inside)需要帮助构建正则表达式以匹配特定字符串(内部示例)
【发布时间】:2009-08-24 22:24:42
【问题描述】:

我正在开发一个需要匹配正则表达式和字符串的程序。该字符串实际上非常简单,但我当前的正则表达式有问题(我正在使用 .net 正则表达式引擎)

我当前的正则表达式是“^[VvEeTtPp][^a-zA-Z0-9\s]\d{0,12}?$”

现在,我要匹配的字符串总是遵循这个模式

  1. 首先是单个字母(在任何一种情况下都只允许使用 V、E、P、T 字母)
  2. 然后,一个破折号
  3. 最后从 4 到 12 位。

最后一个限制是,正则表达式必须匹配任何符合规则的子字符串(例如“V”或“E-”或“P-123”)

正则表达式运行良好,但它会接受诸如“V--”之类的内容。

谁能帮我写一个更好的表达方式??

谢谢

【问题讨论】:

  • 嗯...您的正则表达式看起来不正确...有一个没有开始括号的结束括号。
  • 你说得对,括号不应该在那里,我正在编辑它
  • 子字符串怎么样?您想要任何有效值的子字符串,还是只需要从有效值的第一个字符开始的子字符串? “-123”是不是一个有效的子字符串?
  • "-123" 将是一个有效的子字符串,它们必须从第一个字符(字母)开始
  • 错字...我不是说“-123”不会

标签: .net regex


【解决方案1】:

应该这样做:

^[EPTVeptv](-(\d{4,12})?)?$

编辑:
要同时匹配“P-123”、“-123”和“123”等子字符串:

^(?=.)[EPTVeptv]?(-\d{,12})?$

编辑 2:
在开头添加了一个肯定的前瞻,以便该模式与子字符串“”不匹配。尽管这是合法值的有效子字符串,但我假设您不想要那个特定的子字符串...

【讨论】:

  • 感谢您的快速回答,但正则表达式无法匹配“p-”或“v-”等。
  • 在 P-123 上失败,即“应该匹配”
  • @Gravell,正如我在对该问题的评论中所说,我认为该示例不正确。
  • Hm...它是否也应该匹配子字符串“-0”和“123”?
  • 我欢迎 OP 澄清这一点,但它是匹配模式的真正子字符串...
【解决方案2】:

好吧,4-12 规则的子字符串实际上只是使其成为 1-12 规则,那么如何:

        Regex re = new Regex(@"^[VvEeTtPp](-|-[0-9]{1,12})?$");
        Console.WriteLine(re.IsMatch("B"));
        Console.WriteLine(re.IsMatch("V"));
        Console.WriteLine(re.IsMatch("E-"));
        Console.WriteLine(re.IsMatch("P-123"));
        Console.WriteLine(re.IsMatch("V--"));

【讨论】:

  • 对所有测试用例都非常有效。您介意向我解释一下这部分正则表达式 (-|-[0-9]{1,12}) 是什么吗?有吗?
  • "(-|-[0-9]{1,12})?"与 "(-\d{,12})?" 相同;它匹配一个破折号,后跟最多 12 位数字,零次或一次。
  • (零或一)(破折号或破折号后跟 1-12 位数字)
  • @Guffa... 是的,那可能也可以。正则表达式的问题之一;你可以用两种方式写同样的东西。
【解决方案3】:

[VvEePpTt]-\d{4,12}

【讨论】:

  • 不匹配“V”或“E-”,但匹配“kjsdfhlaksjdft-9938472283kljsad457l435k7j43fha3457sdf”...
【解决方案4】:

你能试试这个并告诉我它是否有效吗?

^[VvEeTtPp](-(\d{4,12}){0,1}){0,1}$

它将接受指定字符中的单个字符,后跟任何内容或一个破折号,而破折号后面不是 4-12 位数字或 4-12 位数字并匹配它们。例如:

  • V
  • **V-**12
  • V12
  • V-12345
  • P-1234567890123

编辑:在末尾添加一个 $,因此如果字符串包含任何额外字符,它将失败

【讨论】:

  • OP 建议(虽然我有点不清楚)“P-123”应该匹配,但事实并非如此。你可能想要一个终止 $
  • 这看起来像是 Guffa 答案的详细版本:'{0,1}' 可以替换为 '?'
  • @Kiranu:它与 V--------- 不匹配。它匹配前两个字符,这是您说想要的子字符串...您应该更详细地指定您需要的内容。
  • @Kiranu:如果您不想匹配它们,只需在末尾使用 $。
【解决方案5】:

我认为这种模式符合规范。

string pattern = @"^[VvEePpTt](?:$|-(?:$|\d{1,12}$))";
// these are matches
Console.WriteLine(Regex.IsMatch("V", pattern));
Console.WriteLine(Regex.IsMatch("v-", pattern));
Console.WriteLine(Regex.IsMatch("P-123", pattern));
Console.WriteLine(Regex.IsMatch("t-012345678901", pattern));
// these are not
Console.WriteLine(Regex.IsMatch("t--", pattern));
Console.WriteLine(Regex.IsMatch("E-0123456789012", pattern));

模式分解:

^             - start of string
[VvEePpTt]    - any of the given characters, exactly once
(?:           - start a non-capturing group...
$|-           - ...that matches either the end of the string or exactly one hyphen
(?:           - start a new non-capturing group...
$|\d{1,12}$   - that matches either the end of the string or 1 to 12 decimal digits
))            - end the groups

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多