无法取反正则表达式

5

我正在尝试在JavaScript中实现以下正则表达式的否定:

^(\d)\1+-(\d)\1+-(\d)\1+$

该表达式匹配以下内容:

  • 11111-111-11111
  • 22-2222-2222
  • 55-55555-55

但不匹配以下内容:

  • 12-22-3345
  • 32-44555-3333

我希望它执行与上述情况相反的操作。

我尝试了以下正则表达式,但它们不起作用:

^(?!(\d)\1+-(\d)\1+-(\d)\1+)$
^(?!(\d))\1+-(?!(\d))\1+-(?!(\d))\1+$
^(?!(\d)\1+)-(?!(\d)\1+)-(?!(\d)\1+)$

我原本以为自己对负向先行断言有很好的理解,但显然不是这样。请问我在这里做错了什么?有没有人能指点我一个正确的解决方法?

编辑:这里提供一个链接,可以尝试当前的正则表达式:https://regex101.com/r/jY9mJ6/1


你原始的正则表达式^(\d)\1+-(\d)\1+-(\d)\1+$在你尝试否定它之后,也匹配了下面这些:11111-21-3111122-5222-622255-85555-95等。这是有意为之吗?我的印象是每个数字块应该只包含一个数字。 - Sam Choukri
那不是故意的!发现得好。它们应该各自由一个数字组成以进行匹配。我以为我已经想通了... - Ryan Duffing
我认为你想要的正则表达式是:^(\d)\1+-(\d)\2+-(\d)\3+$。这将要求每个块由2个或更多相同的数字组成(但是每个块中的数字可以不同)。现在你只需要使用anubhava的解决方案对其进行否定。 - Sam Choukri
那也行不通。我试图匹配所有块都是相同的数字。 - Ryan Duffing
1
哦,如果是这样的话,那就更容易了:^(\d)\1+-\1+-\1+$。这假设块 2 和块 3 可以是 1 个或多个数字。如果您需要它们是 2 个或多个数字:^(\d)\1+-\1\1+-\1\1+$^(\d)\1+-\1{2,}-\1{2,}$ - Sam Choukri
我希望有更多的方法能够感谢你,Sam。你给了我很大的帮助。 - Ryan Duffing
1个回答

2

1
我忘了提到我曾经尝试过:^(?!(\d)\1+-(\d)\1+-(\d)\1+).*$。我离成功很近了!谢谢! - Ryan Duffing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接