【问题标题】:Regex : Match digits with hyphens and white spaces only正则表达式:仅匹配带有连字符和空格的数字
【发布时间】:2017-07-17 16:33:05
【问题描述】:

我正在尝试匹配由连字符或空格(如银行帐号)连接的至少 5 个字符(对于整个字符串)的数字。

例如

“12345-62436-223434”

“12345 6789 123232”

我应该也能匹配

“123-4567-890”

我正在使用的当前模式是 (\d[\s-]*){5,}[\W]

但我遇到了这些问题。

  1. 执行此操作时,我会在匹配至少 5 个数字字符的数字后匹配所有空格
  2. 我要替换它,所以我只想匹配数字,而不是空格和连字符。

    当我得到比赛时,我想做的就是像下面那样掩盖它。

从“12345-67890-11121”到“*****-*****-*****”

从“12345 67890 11121”到“***** ***** *****”

我唯一的问题是我无法像我想要的那样匹配它。

谢谢!

【问题讨论】:

  • 这是什么正则表达式的味道??? javascript/python/ c#??????
  • @AbdulHameed 我真的不明白这个味道,但我会在 java 上做这个。
  • 两个问题:1)有多少个数字分组,2)每个分组有多少个数字?有范围吗?
  • @TimBiegeleisen 我会更新问题,我认为分组没有必要,我也应该匹配这样的东西。 “123 4567 89”或“123-4567-89”
  • 根据您的新编辑,123-4 是阳性测试用例吗??

标签: regex


【解决方案1】:

这个可能对你有用(不过可能有一些误报):

\d[ \d-]{3,}\d

a demo on regex101.com

【讨论】:

  • 这与所要求的 - 不匹配
  • 这个不错,我只是做了一些修改 \d[ \d-]{5,}\d 不过,非常感谢你!
  • 注意:此正则表达式不符合 5 位或更多位的要求,请参见此处:regex101.com/r/06C93P/1
  • @TimBiegeleisen:你是对的,如所述的误报。
  • 这将无法满足您至少 5 位数的要求。1- -5 将被匹配
【解决方案2】:

也许你想要这样的东西:

(\d{5,})(?:-|\s)(\d{5,})(?:-|\s)(\d{5,})

Demo

编辑:

(\d+)(?:-|\s)(\d+)(?:-|\s)(\d+)

Demo

【讨论】:

  • 我会更新问题,但这非常有帮助,谢谢!
  • 我还需要匹配像这样的“123-4567-890”,我的意思是整个字符串中应该至少有5位数字,它们是否连续
  • 哦!恐怕直接使用正则表达式是不可能的。您可以做的只是遍历捕获的组并计算存在的位数。
【解决方案3】:

这里的一个选项是采用您现有的模式,然后添加一个肯定的前瞻,它断言模式中有 七个 或更多字符。假设帐号中有两个空格或破折号,这将保证有五位或更多位。

您可以尝试使用以下正则表达式:

^(?=.{7,}$)((\\d+ \\d+ \\d+)|(\\d+-\\d+-\\d+))$

测试代码:

String input = "123-4567-890";
boolean match = input.matches("^(?=.{7,}$)((\\d+ \\d+ \\d+)|(\\d+-\\d+-\\d+))$");
if (match) {
    System.out.println("Match!");
}

如果您需要先从较大的文档/来源中提取帐号,然后执行此操作,然后您可以应用上面的正则表达式逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2011-02-11
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多