【问题标题】:How can I split "lastname, firstname" into separate strings?如何将“姓氏,名字”拆分为单独的字符串?
【发布时间】:2008-12-23 20:28:09
【问题描述】:

将字符串“Parisi, Kenneth”分成“Kenneth”和“Parisi”的最佳方法是什么?
我仍在学习如何使用这些正则表达式解析字符串,但不太熟悉如何将 var 设置为等于匹配的字符串以及匹配(或不匹配)字符串的输出。

【问题讨论】:

    标签: regex perl


    【解决方案1】:
    my ($lname, $fname) = split(/,\s*/, $fullname, 2);
    

    注意第三个参数,它将结果限制为两个。不是严格要求,但恕我直言,这是一个很好的做法。

    【讨论】:

    • ... 假设输入中的每个名称都采用最后一种格式。如果缺少逗号,$fname 不会是 undefined 吗?
    • @aardvark:是的,但是垃圾进,垃圾出。 OP 没有提到这是一项要求。
    • 好电话。当拆分可以进行时,切勿使用正则表达式。
    • @Robert:冒着迂腐的风险,第一个要拆分的参数是正则表达式。 :-)
    • 如果有多个逗号,则表示您丢失了部分名称。
    【解决方案2】:

    对于没有 unicode 字符的名称,这样的事情应该可以解决问题:

    my ($lname,$fname) = ($1,$2) if $var =~ /([a-z]+),\s+([a-z]+)/i;
    

    分解:

    • ([a-z]+)匹配一系列字符并将其分配给第一组$1
    • , 匹配逗号
    • \s+ 匹配一个或多个空格(如果空格是可选的,将 + 更改为 *)
    • ([a-z]+)匹配一系列字符,并分配给第二组$2
    • i 不区分大小写匹配

    您可以更改字符类 [a-z] 以包含您认为对名称有效的字符。

    【讨论】:

    • [a-z] 可以包含所有有效的名称字符。
    • 是的,PhiLho 在这种情况下是对的,我确实有他举例的这两种格式的姓氏实例。
    • 哦,但感谢您的故障。这就是我真正需要的最大帮助。
    • 如果名称中有非字母字符,可以将 then 添加到匹配模式中:([a-z'-]+)
    • 很酷,谢谢.. 如果我遇到特殊情况的名称并需要切换或添加代码,请记住这一点
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多