我一直在努力使用正则表达式来获取带有破折号的名称的首字母。
例如,约翰·史密斯,我应该得到JS
我的正则表达式如下:
name.match(/(^\S\S?|\b\S)?/g).join("").match(/(^\S|\S$)?/g).join("").toUpperCase()
但是,它不会为姓氏选择正确的首字母。例如:
"约翰·安德鲁·史密斯,我应该得到JA"
但是,我得到JS。
为什么它拿起破折号后的字母,我有点困惑。
任何帮助都非常感谢
编辑:对不起,忘了加上这一部分,我应该忽略任何中间名的首字母。例如,约翰安德鲁史密斯,应该是JS,而不是JAS。因为安德鲁将被视为一个中间名
如果姓氏中有破折号,则它是姓氏的一部分,因此Andrew-Smith将是姓氏
4条答案
按热度按时间hgc7kmma1#
我先拆分空格得到数组中所有的首字母,然后把数组中的第一个元素和最后一个元素连接起来,比如:
如果你真的想使用正则表达式,并在一行中完成上面的操作,你可以这样做:
我真傻!整件事可以是:
基本上,捕获第一个首字母,然后贪婪地忽略最后一个空格字符之前的所有字符,然后捕获下一个字符,最后忽略字符串末尾之前的所有字符
bvk5enib2#
我将使用
/(?<!-)[A-Z]/g
ddrv8njm3#
使用regex的更直接的方法是:
([A-Z])
中的第一个大写字母\w+
\s
([A-Z])
中的另一个大写字母\w+
^([A-Z])\w+\s([A-Z])\w+
虽然正如评论中提到的,regex对于这样的东西来说是矫枉过正的。
l7mqbcuq4#
你可以试试这个:
因为你说你不想匹配中间名,所以我决定先匹配第一个单词的第一个字母,然后再与最后一个单词的第一个字母进行连接。
/^(\S)\S+/g
:从头匹配单词的第一个字母。/(\S)\S+$/g
:匹配单词结尾的第一个字母。