如何更改我的正则表达式以消除连续的相同特殊字符?

How can I change my regex to eliminate consecutive identical special characters?

我的正则表达式用于验证名字和姓氏。可接受的形式如下:

不能接受的形式如下:

我当前的正则表达式如下。

^[\w'\-,.][^0-9_!¡?÷?¿\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$

它可以正常验证所有名称,除了:

这是因为正则表达式没有考虑连续的相同特殊字符。如何更改我的正则表达式以将这些考虑在内?

^(:?[^0-9'\-\., _!¡?÷?¿\+=@#$%ˆ&*(){}|~<>;:[\]]+(:?['-]|, | |\.|\. |$))+$

我使用了你的禁用字符集并添加了 '\-\., 。然后我让他们重复+。我插入一组允许的除数:(:?['-]|, | |\.|\. |$) 并允许重复此模式 +.
我试过了here.

您可以在验证之前单独进行。使用 Perl 正则表达式,要删除额外的特殊字符,它将是:

s/(\W)+//g

例如:

$ echo "John O’’Shaughnessy--Smith" | perl -C -pe 's/(\W)+//g'
John O’Shaughnessy-Smith

您可以通过使用带有反向引用的否定前瞻来排除连续字符,以断言不是直接后跟相同字符的字符 ^(?!.*([’-])

请注意,您当前的模式匹配至少 3 个字母长的名称,并且不会匹配 Al

等名称

如果您也想匹配它,可以将模式中的 {2,} 更改为 +

^(?!.*([’-]))[\w',.-][^\n\r0-9_!¡?÷¿\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$

Regex demo

匹配名称可能很困难,此页面有一篇关于名称的有趣读物:

Falsehoods Programmers Believe About Names