【问题标题】:How to construct Perl regex to replace (lowercase followed by uppercase) by (lowercase. uppercase)?如何构造 Perl 正则表达式以将(小写后跟大写)替换为(小写。大写)?
【发布时间】:2014-03-14 22:47:15
【问题描述】:

我想编写一个 perl 正则表达式来将某些模式替换为其他模式。源模式是小写后跟大写。目标模式是小写字母后跟点、空格和大写字母。

这是一个例子:

CamelCase

我想改成如下:

Camel. Case

提前致谢!

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    另一种也接受 utf8 的解决方案:

    use Modern::Perl;
    use utf8;
    use Encode qw(encode);
    
    foreach ( qw(CamelCase ČamelČasě ŽaBaČek) ) {
        say Encode::encode('utf8', "$1. $2")
            if( m{(\b\p{Upper}\w*)((?:\p{Lower}\w*\p{Upper}|\p{Upper}\w*\p{Lower})\w*\b)} );
    }
    

    生产

    Camel. Case
    Čamel. Časě
    ŽaBa. Ček
    

    基于:https://stackoverflow.com/a/6323679/632407

    【讨论】:

      【解决方案2】:

      我建议如下:

      $StringToConvert = s/([A-Z][a-z]+)(?=[A-Z])/$1\. /g;
      

      积极的展望“(?=[A-Z])”是关键。唯一被替换的词是那些前面有另一个大写字符的词。

      还要注意“g”,它表示全局搜索字符串。结果如下:

      CamelCase
      Camel. Case
      

      还有

      CamelCaseMultiple
      Camel. Case. Multiple
      

      字符串中可能有尽可能多的大写单词。

      【讨论】:

        【解决方案3】:

        使用拆分和连接的解决方案:

        my $str = 'CamelCase';
        
        my @words = split /(?=[A-Z])/, $str;
        
        print join '. ', @words;
        

        【讨论】:

        • 此解决方案还将更改几个大写字母,例如:theEEUU
        • 是的,如果 OP 想要避免这种极端情况,则必须将解决方案修改为 my @words = split /(?<![A-Z])(?=[A-Z])/, $str;
        猜你喜欢
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 2013-07-24
        相关资源
        最近更新 更多