【问题标题】:Regex on limiting one occurrence of particular character正则表达式限制特定字符的一次出现
【发布时间】:2018-07-11 19:47:54
【问题描述】:

我正在研究一个允许字符“x”和 0-9 之间的任何数字的正则表达式。

以下是规则。

  • 整个字符串的长度必须为 4
  • 只接受 0-9 或 'x'
  • 必须只有一个“x”

^(x|[0-9])(x|[0-9])(x|[0-9])(x|[0-9])$

我目前的正则表达式只支持规则 1 和 2,但它不会过滤掉那些有多个“x”的人

x000 //ok
xxxx //ok , but should be not ok
23xx //ok , but should be not ok
a90d //not ok
11x1 //ok
x213 //ok

sample regex editor here

由于正则表达式将用于 keyup 中的验证,因此该规则必须关注用户何时键入从一到四个 keyup。

更新规则

  • 整个字符串的长度必须在 0 到 4 之间
  • 只接受 0-9 或 'x'
  • 不能有多个“x”

【问题讨论】:

  • 你在使用 Ruby 吗?
  • @WiktorStribiżew 不,我只使用该页面进行测试,我正在编写一个用于在 javascript 中进行验证的页面,它们有什么不同吗?
  • 您似乎在使用Robin Herbots InputMask 插件,对吧?它只支持每个字符的正则表达式。它不会对整个字符串应用掩码。
  • 是的,我认为稍微改变规则会起作用,jsfiddle.net/cxb2np75/25,这是小提琴,你答案中的正则表达式确实能够控制 4 个字符。

标签: regex


【解决方案1】:

你可以使用

/^(?=[0-9x]{4}$)[0-9]*x[0-9]*$/

/^(?=[\dx]{4}$)\d*x\d*$/

详情

  • ^ - 字符串开头
  • (?=[\dx]{4}$) - 正向前瞻检查从字符串的开头到结尾是否正好有 4 个数字或 x
  • \d* - 0+ 位
  • x - x
  • \d* - 0+ 位
  • $ - 字符串结束。

regex demo

请注意,在这种情况下,您甚至可以将整个模式简化为

/^(?=.{4}$)\d*x\d*$/
  ^^^^^^^^^

只检查字符串的长度而不检查字符的类型(因为数字和x 是非换行符)。

【讨论】:

  • 这条线如何工作 /^(?=.{4}$)\d*x\d*$/ ,只检查 1 x
  • @LeonArmstrong 已经解释过了。请参阅详情^\d*x\d*$ 确保只有 1 个 x^(?=.{4}$) 确保字符串长度为 4 个字符。
  • 谢谢,我知道了
  • jsfiddle.net/cxb2np75/13,我用我的 fiddle 试过了,正则表达式仍然可以输入多个 x ,你能就此提出建议吗?
  • @LeonArmstrong 您是否试图限制对 HTML5 输入字段的输入?您只能使用pattern 进行验证。
【解决方案2】:

对“仅 1 x”条件使用前瞻:

^(?=\d*x\d*$).{4}$

【讨论】:

  • @tim 前瞻断言正好有 1 x。
  • 您甚至可以将其缩减为^(?=\d*x\d*$).{4}$,因为无需两次检查特定模式。但是,我在回答中建议/^(?=.{4}$)\d*x\d*$/,因为在开头检查长度会使不匹配的字符串更快失败(如果长度不允许,为什么要检查字符是否为数字)。
【解决方案3】:

一个选项使用前瞻来处理x 要求:

^(?=.*x)(?!.*x.*x)[0-9x]{4}$

查看正则表达式演示。

Demo

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 2018-07-14
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多