[英]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)
是負面預測,以確保我們不匹配行的開頭。
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.