1

後方参照の値を変更する方法はありますか?

例:次のテキスト

"this is a test"

「テスト」という単語を抽出し、逆参照を介して別のテキストに挿入する必要があります。

正規表現:

(test)

置換:

"this is another \1"

これまでのところ問題なく動作します。しかし、ここで問題となるのは、挿入する前に後方参照を変更できるかどうかです。「テスト」という単語を大文字に変換するようなものです。

私はそれが次のように見えるかもしれないと思います:

"this is another \to_upper\1"

正規表現の「標準」(標準はありますか?)で定義されているものはありますか?

4

1 に答える 1

5

多くの実装(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.
于 2010-07-30T09:18:55.933 に答える