【问题标题】:How can I remove middle initial with a dot at the end?如何删除中间的首字母并在末尾添加一个点?
【发布时间】:2010-10-01 15:15:02
【问题描述】:

我在一个字段中有一堆名字,它们的中间首字母带有“。”最后..

我需要一个正则表达式来转换这个例子:

Kenneth R.



Kenneth

我正在尝试建立自己的网站并发现这个有用的网站顺便说一句..

http://www.gskinner.com/RegExr/

但我是 Perl 和正则表达式的新手,只能得到“...$” -当名字的末尾没有中间名首字母时,这是没有用的......


我刚刚发现了另一种需要考虑的名称格式... 'R.凯利'需要是'凯利'

【问题讨论】:

    标签: regex perl parsing expression


    【解决方案1】:

    如果它以点结尾,则删除最后一个“单词”:

    my $name =~ s/\w+\.$//i;
    

    (这假设你在那之后没有任何空间)

    删除任何以点结尾的单词:

    my $name =~ s/\w+\.//i;
    

    如果你想将它们全部删除,请查看 /g 修饰符...

    顺便说一句,让自己成为一个测试用例列表来检查你的解决方案 然后尝试使用真实的单词数据,您可能会得到一些惊喜......

    【讨论】:

    • 这行得通...非常感谢...也请参阅我对 R. Kelly 的编辑。我在数据库中有几个名字也有这种格式
    • hahah nm 谢谢,我看到了您的原始答案并刷新了,现在您的第二个出现了
    • 你能给我简要介绍一下每个元素在这些中的工作原理吗?我想了解更多关于这些的信息,即使你知道它们应该做什么,它们也非常不直观
    • 您可能还想删除首字母之前的空格:my $name =~ s/\s+\w+\.$//i;
    • 如果你想用一种方法来解释你得到和不理解的正则表达式,你可以试试 CPAN 的 YAPE::Regex::Explain 模块。 search.cpan.org/~pinyan/YAPE-Regex-Explain-3.011/Explain.pm
    【解决方案2】:

    处理 R. Kelly 案:

    s/\w\. *//g
    

    这是一个快速测试:

    $ echo 'R. Kelly
    Kenneth R.
    R. Kemp R.
    John Q. Smith' | perl -pe 's/\w\. *//g'
    Kelly
    Kenneth 
    Kemp 
    John Smith
    

    我建议:

    1. 需要全局选项 (g)。
    2. 不区分大小写的选项 (i) 不是。
    3. 您可以考虑仅查找大写 ([:upper:]) 首字母。
    4. 多字符“首字母”应该被怀疑。 (所以w+ 可能是一个错误,除非您的数据有相关案例。)
    5. 阅读perldoc perlre了解更多信息。

    【讨论】:

    • 但是请注意,如果首字母恰好落在名称的中间,例如“John Q. Smith”,您的解决方案将连接两个周围的词,例如“约翰史密斯”。
    • 我添加了一个简单的修复程序,将任何空格放在字符串的末尾。如果需要,可以使用:s/ *$// 进行清理。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2020-01-01
    • 2020-04-23
    • 1970-01-01
    相关资源
    最近更新 更多