【问题标题】:RegEx for adding a comma and space in between first/last names用于在名字/姓氏之间添加逗号和空格的正则表达式
【发布时间】:2019-04-30 20:39:05
【问题描述】:

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

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

我想在姓和名之间添加一个逗号和空格,以便输出为:

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: regex string regex-group regex-greedy knime


    【解决方案1】:

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

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

    意思是,

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


    编辑:

    根据Pushpesh的建议,可以大大简化为this expression

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

    【讨论】:

    • 谢谢,艾玛!我认为这个解决方案会很完美。但是,可能会在 KNIME 中特别使用它时遇到问题,因为它似乎没有捕获任何组,并且只是不返回任何内容来代替应该捕获的组,即 ", A.; , Joong; , ; , *" 将尝试进一步解决此问题,再次感谢!
    【解决方案2】:

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

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

    用你的例子为我工作。正则表达式可能与回放中收到/建议的所有 3 个都适用。

    【讨论】:

    • 谢谢!这似乎确实有效!是否有可能让它也适用于包含特殊字符的名称?与此示例一样,由于包含特殊字符,某些名称没有分开:SánchezCésar†;朱丽丽‡; BrañaAlfredo F.†;萨拉斯,Aaroa P.†;罗尔于尔根‡§;门德斯卡门†;萨拉斯,何塞 A.†§ 我试过 regexReplace($col1$,"([A-Z][\\w-]+)([A-Z][\\w-]+)" ,"$1, $2") 但这并没有改变任何东西。
    • 不是正则表达式专家,但似乎是 Ashok 解决方案 - ([a-z])([A-Z]) 分离正确。
    【解决方案3】:

    你需要的正则表达式是

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多