如何更改我的正则表达式以消除连续的相同特殊字符?
How can I change my regex to eliminate consecutive identical special characters?
我的正则表达式用于验证名字和姓氏。可接受的形式如下:
- 雅各布·威尔曼
- 威尔曼,雅各布
- 威尔曼,雅各布·韦恩
- O'Shaughnessy, Jake L.
- 约翰·奥肖内西-史密斯
- 金
不能接受的形式如下:
- 蒂米·奥肖内西
- 约翰·奥肖内西--史密斯
- K3vin 马龙
- 警报(“你好”)
- select * 来自用户;
我当前的正则表达式如下。
^[\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,}$
匹配名称可能很困难,此页面有一篇关于名称的有趣读物:
我的正则表达式用于验证名字和姓氏。可接受的形式如下:
- 雅各布·威尔曼
- 威尔曼,雅各布
- 威尔曼,雅各布·韦恩
- O'Shaughnessy, Jake L.
- 约翰·奥肖内西-史密斯
- 金
不能接受的形式如下:
- 蒂米·奥肖内西
- 约翰·奥肖内西--史密斯
- K3vin 马龙
- 警报(“你好”)
- select * 来自用户;
我当前的正则表达式如下。
^[\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,}$
匹配名称可能很困难,此页面有一篇关于名称的有趣读物: