正则表达式:仅将数字与连字符和空格匹配

时间:2017-02-27 06:44:08

标签: regex

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

e.g

“12345-62436-223434”

“12345 6789 123232”

我也应该能够匹配

“123-4567-890”

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

但我遇到了这些问题。

  1. 当我这样做时,我在匹配数字后匹配所有空格,并且至少有5个数字字符
  2. 我要替换它,所以我只想匹配数字,而不是白色空格和超量。

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

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

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

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

    谢谢!

3 个答案:

答案 0 :(得分:2)

也许你想要这样的东西:

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

Demo

修改

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

Demo

答案 1 :(得分:2)

这个可能适合你(可能是一些误报):

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

请参阅a demo on regex101.com

答案 2 :(得分:1)

此处的一个选项是采用现有模式,然后添加一个正面预测,断言模式中有七个或更多字符。假设账号中有两个空格或短划线,这将保证有五位或更多位数。

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

^(?=.{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!");
}

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