javascript 名称首字母上带有破折号的正则表达式

7tofc5zh  于 2023-01-07  发布在  Java
关注(0)|答案(4)|浏览(109)

我一直在努力使用正则表达式来获取带有破折号的名称的首字母。
例如,约翰·史密斯,我应该得到JS
我的正则表达式如下:

name.match(/(^\S\S?|\b\S)?/g).join("").match(/(^\S|\S$)?/g).join("").toUpperCase()

但是,它不会为姓氏选择正确的首字母。例如:
"约翰·安德鲁·史密斯,我应该得到JA"
但是,我得到JS。
为什么它拿起破折号后的字母,我有点困惑。
任何帮助都非常感谢
编辑:对不起,忘了加上这一部分,我应该忽略任何中间名的首字母。例如,约翰安德鲁史密斯,应该是JS,而不是JAS。因为安德鲁将被视为一个中间名
如果姓氏中有破折号,则它是姓氏的一部分,因此Andrew-Smith将是姓氏

hgc7kmma

hgc7kmma1#

我先拆分空格得到数组中所有的首字母,然后把数组中的第一个元素和最后一个元素连接起来,比如:

const allInitials = name.split(" ").map(n => n[0])
const initials = allInitials[0] + allInitials.splice(-1)

如果你真的想使用正则表达式,并在一行中完成上面的操作,你可以这样做:

name.split(" ").map(n => n[0]).join("").replace(/^(.).*(.)$/g, "$1$2")

我真傻!整件事可以是:

name.replace(/^(.).*\s(.).*$/, "$1$2")

基本上,捕获第一个首字母,然后贪婪地忽略最后一个空格字符之前的所有字符,然后捕获下一个字符,最后忽略字符串末尾之前的所有字符

bvk5enib

bvk5enib2#

我将使用/(?<!-)[A-Z]/g

const names = [
  'John Smith',
  'John Andrew-Smith'
]

for (const name of names) {
  const initials = name.match(/(?<!-)[A-Z]/g).join('')
  console.log(name, initials)
}
ddrv8njm

ddrv8njm3#

使用regex的更直接的方法是:

  • 匹配捕获组([A-Z])中的第一个大写字母
  • 则任何其他单词字符\w+
  • 那么空间\s
  • 然后捕获组([A-Z])中的另一个大写字母
  • 然后是任何其他单词字符\w+

^([A-Z])\w+\s([A-Z])\w+
虽然正如评论中提到的,regex对于这样的东西来说是矫枉过正的。

var getInitials = function(name) {
  return name.match(/^([A-Z])\w+\s([A-Z])\w+/).splice(1, 2).join("");
}

console.log(getInitials("John Smith"));
console.log(getInitials("John Andrew-Smith"));
l7mqbcuq

l7mqbcuq4#

你可以试试这个:

const text = 'John Andrew Smith'
let result = /^(\S)\S+/g.exec(text)[1] + /(\S)\S+$/g.exec(text)[1];
document.write(result);

因为你说你不想匹配中间名,所以我决定先匹配第一个单词的第一个字母,然后再与最后一个单词的第一个字母进行连接。
/^(\S)\S+/g:从头匹配单词的第一个字母。
/(\S)\S+$/g:匹配单词结尾的第一个字母。

相关问题