用于在 first/last 名称之间添加逗号和 space 的正则表达式

RegEx for adding a comma and space in between first/last names

我有一个姓名列表,其中姓氏和名字一起出现:

BorisovaSvetlana A.; KimHak Joong; PuXiaotao; LiuHung-wen*

我想在姓氏和名字之间添加逗号和 space,输出为:

Borisova, Svetlana A.; Kim, Hak Joong; Pu, Xiaotao; Liu, Hung-wen*

我在 KNIME 中使用一个字符串操作节点,我认为 regexReplace($col1$, ,"") 会被使用,并且可能会使用 [a-z] 和 [A-Z] 来查找小写字母直接跟在 a 后面的一些前瞻性实例大写字母,但我是正则表达式的新手,所以到目前为止我只有这些。

如何解决这个问题?

您需要的正则表达式是

([a-z])([A-Z])

第 1 个捕获组 ([a-z]) 匹配下面列表中的单个字符 [a-z] a-z 介于 a(索引 97)和 z(索引 122)之间的单个字符(区分大小写)

第 2 个捕获组 ([A-Z]) 匹配下面列表中的单个字符 [A-Z] A-Z 介于 A(索引 65)和 Z(索引 90)之间的单个字符(区分大小写)

This RegEx 可能会帮助您设计一个合适的表达式来匹配您的所有输入:

([A-Z]{1}[a-z-]{1,})([A-Z]{1}[a-z-]{1,})
  • 它有两个捕获组,一个用于名字,另一个用于姓氏。
  • 它不匹配拉丁字符,如果您愿意,可以将 a-z 更改为 \w
  • 您可以简单地创建一个字符串替换,将 </code> 替换为 <code>,
  • 如有必要,您还可以为表达式添加额外的边界。

也就是说,

  • 名字一个大写字母后跟一个或多个小写字母和破折号,姓氏也是如此,您可以根据需要简单地更改两组内的这些边界。


编辑:

基于Pushpesh's advice, it can be much simplified to this expression:

([A-Z][a-z-]+)([A-Z][a-z-]+)

字符串操作节点中的 KNIME 语法应如下所示:

regexReplace($col1$,"([A-Z][a-z-]+)([A-Z][a-z-]+)" ,", ")

你的例子对我有用。正则表达式可以类似,因为它在回放中与所有 3 个 received/suggested 一起工作。