【问题标题】:Regex match optional character only if non-digit正则表达式仅在非数字时匹配可选字符
【发布时间】:2016-10-02 15:45:25
【问题描述】:

我正在尝试匹配第一个字符为 1-9 且接下来的三个字符为 0-9 的字符串 a。 如果有任何附加字符,则第一个附加字符不能是数字。完整的字符串不能包含 @ 字符。

应该通过的字符串

  • 1234
  • 1234 5678910
  • 1234AB 12345678
  • 1234stackoverflow
  • 1234 堆栈溢出

不应该通过

  • 0123
  • 123
  • 12345
  • 1235@6789
  • ABCDEF

到目前为止,我想出了^[1-9][0-9]{3}(\D)?。但这也通过了12345

任何帮助或指导将不胜感激:)

【问题讨论】:

  • 尝试将 (\D) 更改为 (\D)+
  • 试试^[1-9][0-9]{3}(\D|$)

标签: regex


【解决方案1】:

试试这个正则表达式:

^[1-9][0-9]{3}([^@0-9][^@]*)?$

如果我正确阅读了您的要求,匹配的字符串应以 1-9 开头,后跟任意数字的 3 位数字,如果不是数字或符号,则后跟任何数字。正则表达式中的[^@0-9] 是一个负字符类,匹配任何非数字字符而不是at 符号。

演示在这里:

Regex101

【讨论】:

  • 无法再编辑我的评论。我想说:谢谢!这与我所追求的非常接近。我意识到我在要求中犯了一个错误(并编辑了我的初始要求)。匹配的字符串应以 1-9 开头,后跟 3 位任意数字,后面的任何字符中的第一个不能是数字或 @。此后的任何字符都可以是 @ 以外的任何字符。
  • @Kaspar 我根据您的新要求更新了我的答案。
  • [^@0-9]? 部分实际上并不需要(它是多余的)。一旦你删除它,我建议将(|...) 更改为更传统的(...)?
  • @ruakh 再次检查。我认为这根本不是多余的。如果您认为可以简化,请发布您的正则表达式。
  • @TimBiegeleisen:^[1-9][0-9]{3}([^@0-9][^@]*)?$
【解决方案2】:

使用这个^[1-9][0-9]{3}(?:$|[^@\d][^@]*)

console.log('1234'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('1234 5678910'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('1234AB 12345678'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('1234stackoverflow'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('1234 stackoverflow'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('0123'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('123'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('12345'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('1235@6789'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));
console.log('ABCDEF'.match(/^[1-9][0-9]{3}(?:$|[^@\d][^@]*)/));

【讨论】:

  • 我想你的意思是这样说的:^[1-9][0-9]{3}(?:$|[^@\d][^@]*$) ...但我喜欢这种方法
【解决方案3】:

您可以使用它来获得正确的匹配:

/^[1-9]\d{3}[a-z]*$/i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2011-04-29
    相关资源
    最近更新 更多