2015-06-20 182 views
1

想知道如何验证一个字符串,如前3连续数字不能连续8或9?例如:正则表达式来检查前3个连续数字

88839182 (not valid) 
99923213 (not valid) 
98188823 (valid) 
98939117 (valid) 

使用s.match("([98]){3}")尝试,但它似乎没有工作,因为它需要在989的第3个字符了。

回答

3

您可以使用下面的正则表达式识别连续3个8或9:

"(?:([98])\1\1)" 

Demo

并匹配你愿意,你可以提前使用负看数字来匹配没有按号码“T之前通过连续3 9或8:

^(?!(?:([98])\1\1)).*$ 

Demo

另外,作为一个很好的建议,由@ Luv2code您可以使用正则表达式之后,将被迫您正则表达式引擎匹配的数字:

(?=^\d+$)(?!([98])\1\1)\d+ 
+0

嗨!感谢您的回复。我只想要前3个连续的数字。后续的连续数字被认为是有效的 –

+0

@ahgal欢迎!检查编辑! – Kasramvd

+0

@卡斯拉,很好的解决方案。我会指出,如果要求只捕获数字(这不是特定的,但是基于示例如何解释需求​​),那将是一个不同的正则表达式。您的正则表达式将匹配123abc,foo,“hello world”等。要将其限制为仅数字:“(?=^\ d + $)(?!([98])\ 1 \ 1)\ d +”第一个断言确保整个字段都是数字。第二个主张是你的。最后,我使用了\ d而不是点,所以如果你想123中的“123 z”改变^和$到\ b和瞧! – Luv2code

0

我会假设你的问题说法正确的是:你想(一)发现(b)如果这是888或999,则拒绝该字符串。因此,分两步进行:

  1. 查找并提取前三个连续数字。
  2. 拒绝的字符串,如果比赛是888或999

匹配三个连续数字的正则表达式仅仅是(\d)\1\1。其余依赖于你的编程语言(你没有指定);它几乎肯定是一种返回数字字符串中第一个匹配内容的方法。

0

另外,定义问题是 “不与888或999开始” 的更简单的方法,

它找到无效数据:

s.match("^(999|888)") 

要找到有效数据;数据;

!s.match("^(999|888)") 
+0

尽管如此,匹配* do *以'888'或'999'开始的字符串。 – Joey

+0

@joey是的 - 这就是OP的代码所做的(他抱怨它*也匹配989 ...) – Bohemian

+0

啊,够公平的;我错过了那部分。只是这些问题通常源于基于正则表达式的验证,您所能做的只是提供* valid *值的正则表达式,因此不能编写任何代码来反演结果,在这种情况下,必须使用负面预测来解决。 – Joey