繁体   English   中英

正则表达式:使用前缀替换匹配组中的所有大写字母

[英]Regex : Replace All Uppercase in a Matched Group with a prefix

假设数据库记录的SQL INSERT行:

.... ,'DateOfBirth' , N'DateOfBirth')

如何在单个Perl REGEX表达式中将其替换为以下内容?

.... ,'DateOfBirth' , N'Date Of Birth')

目的是保持第一列不变,同时向第二个Description列添加空格。

以下是我的发现:

Pattern: (, N'.+)([a-z])([A-Z])(.+)
Returns: ,'DateOfBirth' , N'DateOf Birth')  -- "DateOf" missed by the pattern.

Pattern: "[A-Z]" to replacement " \1" -- Gets the job done, but all Uppercase occurence impacted.
Returns: ,'Date Of Birth' , N'Date Of Birth')

您可以使用此正则表达式进行搜索:

/(?:N'|(?!\A)\G)[A-Z][a-z]*/g

并将其替换为:

"$0 "

\\G在上一场比赛结束或第一场比赛的字符串开头处断言位置。 在这种情况下,我们首先找到N'后跟一个大写字母后跟0或更多小写字母。 然后在那个地方插入一个空格。 然后使用\\G我们从上一场比赛结束时找到下一场比赛。

(?!\\A)是负面预测,以确保我们不匹配行的开头。

RegEx演示

Perl的方式是为了提高可读性/可维护性:

#!/usr/bin/env perl

use strict; use warnings;

sub f {
    $_ = shift;
    return join " ", split /([A-Z]+[a-z]+)/;
}

while (<>) {
    s|(?<=N')([^']+)|f($1)|e;
    print;
}

或者在shell中:

$ echo ".... ,'DateOfBirth' , N'DateOfBirth')" | perl -pe '
    BEGIN{
        sub f {
            $_ = shift;
            return join " ", split /([A-Z]+[a-z]+)/;
        }
    }
    s|(?<=N\047)([^\047]+)|f($1)|e
'

输出:

.... ,'DateOfBirth' ,  N'Date  Of  Birth')

注意 :

  • (?<=N')是一个断言
  • 为了做到这一点,我在替换中运行f()函数,由e修饰符赋予

(?:(?:\\sN')?([AZ][az]*)|(?:\\1))(\\1)*匹配'Date' 'Of''Birth'

针对UltraEdit查找/替换(Boost C ++ Perl 5.8正则表达式语法)提供的解答设计工作解决方案:

Find Pattern:   
(N'[A-Z][a-z]+|\G)([a-z]+)([A-Z]+)

Replace Pattern:
\1\2 \3
\1 is (N'[A-Z][a-z]+|\G)
\2 is ([a-z]+)
\3 is ([A-Z]+)

Input:
.... ,'DateOfBirth' , N'DateOfBirth')

Output:
.... ,'DateOfBirth' , N'Date Of Birth')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM