我的regex用于验证名字和姓氏。可接受的表格如下:
不可接受的形式如下:
我目前的准则如下。
^[\w'\-,.][^0-9_!¡?÷?¿\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$它可以正确地验证所有名称,但以下情况除外:
原因是正则表达式没有考虑到连续的相同的特殊字符。我怎样才能改变我的准则来考虑这些因素呢?
发布于 2021-11-24 10:05:52
可以使用带反向引用的负向查找来断言字符,而不是直接后面跟着相同字符^(?!.*([’-])\1,从而排除连续字符。
请注意,当前模式与至少3个字母长的名称匹配,并且不匹配例如Al之类的名称。
如果您也想匹配,可以在模式中将{2,}更改为+。
^(?!.*([’-])\1)[\w',.-][^\n\r0-9_!¡?÷¿\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$匹配名称可能很困难,此页有关于名称的有趣阅读:
发布于 2021-11-24 09:56:49
^(:?[^0-9'\-\., _!¡?÷?¿\\+=@#$%ˆ&*(){}|~<>;:[\]]+(:?['-]|, | |\.|\. |$))+$我使用了你的禁用字符集,并添加了'\-\.,。然后我让他们重复+。我插入了一组允许的除数:(:?['-]|, | |\.|\. |$),并允许重复此模式+。
我试过了,这里。
发布于 2021-11-24 10:05:36
在验证之前,您可以单独进行。对于Perl regex,要删除其他特殊字符,应该是:
s/(\W)\1+/$1/g例如:
$ echo "John O’’Shaughnessy--Smith" | perl -C -pe 's/(\W)\1+/$1/g'
John O’Shaughnessy-Smithhttps://stackoverflow.com/questions/70092855
复制相似问题