2010-07-30 58 views
1

有沒有辦法修改反向引用的值?正則表達式修改反向引用的值

示例: 在下面的文本

"this is a test" 

單詞「測試」應該提取並插入到經由backrefrence另一文本。

正則表達式:

(test) 

更換:

"this is another \1" 

,到目前爲止,工作正常。但現在的問題是,如果可以在插入前修改反向引用。就像將單詞「test」轉換爲大寫字母一樣。

我覺得它可能看起來像:

"this is another \to_upper\1" 

有沒有在「標準」中定義的東西(有沒有什麼標準可言?)正則表達式?

+2

標準很可能不是,你可以在一些實現中做到這一點:'$ echo testx | perl -pe's /(test)/ \ U \ 1 \'' - >'TESTx' – mykhal 2010-07-30 07:26:56

+2

許多實現(javascript,python等)讓您指定一個函數作爲替換參數 - 該函數通常使用匹配的字符串和捕獲的組作爲參數,其返回值用作替換文本。 – Amarghosh 2010-07-30 08:35:49

+0

@Amarghosh:你也可以將其作爲回答發佈,並在你處理時添加一些示例代碼。 – 2010-07-30 08:48:50

回答

4

許多實現(JavaScript,Python等)讓你指定一個函數作爲替換參數。該函數通常將整個匹配的字符串,其在輸入字符串中的位置以及捕獲的組作爲參數。該函數返回的字符串用作替換文本。

以下是如何使用JavaScript:replace函數將整個匹配的子字符串作爲其第一個參數,捕獲的組的值作爲下一個n參數,後跟原始輸入字符串中匹配的字符串的索引以及整個輸入字符串。

var s = "this is a test. and this is another one."; 
console.log("replacing"); 
r = s.replace(/(this is) ([^.]+)/g, function(match, first, second, pos, input) { 
    console.log("matched :" + match); 
    console.log("1st group :" + first); 
    console.log("2nd group :" + second); 
    console.log("position :" + pos); 
    console.log("input  :" + input); 
    return "That is " + second.toUpperCase(); 
}); 
console.log("replaced string is"); 
console.log(r); 

輸出繼電器:

replacing 
matched :this is a test 
1st group :this is 
2nd group :a test 
pos  :0 
input  :this is a test. and this is another one. 
matched :this is another one 
1st group :this is 
2nd group :another one 
pos  :20 
input  :this is a test. and this is another one. 
replaced string is 
That is A TEST. and That is ANOTHER ONE. 

這裏是Python版本 - 它甚至讓你對每個組開始/結束值:

#!/usr/bin/python 
import re 
s = "this is a test. and this is another one."; 
print("replacing"); 

def repl(match): 
    print "matched :%s" %(match.string[match.start():match.end()]) 
    print "1st group :%s" %(match.group(1)) 
    print "2nd group :%s" %(match.group(2)) 
    print "position :%d %d %d" %(match.start(), match.start(1), match.start(2)) 
    print "input  :%s" %(match.string) 
    return "That is %s" %(match.group(2).upper()) 

print "replaced string is \n%s"%(re.sub(r"(this is) ([^.]+)", repl, s)) 

輸出:

replacing 
matched :this is a test 
1st group :this is 
2nd group :a test 
position :0 0 8 
input  :this is a test. and this is another one. 
matched :this is another one 
1st group :this is 
2nd group :another one 
position :20 20 28 
input  :this is a test. and this is another one. 
replaced string is 
That is A TEST. and That is ANOTHER ONE.