簡體   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