我需要提取中间名和姓氏

Elev: 7EBB49 (Dan Greg Järgenstedt <[email protected]>)
Expected: Greg Järgenstedt

Elev: 6EBB49 (Dan Järgenstedt <[email protected]>)
Expected: Järgenstedt

Elev: 6EBB49 (Järgenstedt <[email protected]>)
Expected: Järgenstedt

Elev: 6EBB49 (<[email protected]>)
Expected:
尝试过
function getSNames(input) {
    const names = input.match(/(?<!\[)(?<=\s)\w+(?=\s)/g);
    return names ? names.join(' ') : '';
}

最佳答案

您可以使用

const names = input.match(/(?<!\(\p{L}+\s+|\p{L})\p{L}+(?:\s+\p{L}+)*(?=\s*<)/gu)
参见regex demou标志启用Unicode类别类。
模式详细信息
  • (?<!\(\p{L}+\s+|\p{L})-紧靠左侧,后面没有(,后面跟着1+个字母,然后是一个或多个空格,或者只有一个字母(作为Unicode字边界)
  • \p{L}+-一个或多个字母
  • (?:\s+\p{L}+)*-零次或多次出现1+个空格,然后出现1+个字母
  • (?=\s*<)-在右边,必须有0+个空格,然后是<
  • 10-06 00:31