Perl:正規表現での検索パターンと置換として文字列変数を使用する方法

カンシイン

正規表現の検索パターンと置換の両方に文字列変数を使用したいと思います。期待される出力は次のようになります。

$ perl -e '$a="abcdeabCde"; $a=~s/b(.)d/_$1$1_/g; print "$a\n"'
a_cc_ea_CC_e

しかし、パターンと置換を変数に移動したとき、$1評価されませんでした。

$ perl -e '$a="abcdeabCde"; $p="b(.)d"; $r="_\$1\$1_"; $a=~s/$p/$r/g; print "$a\n"'
a_$1$1_ea_$1$1_e

「ee」修飾子を使用すると、エラーが発生します。

$ perl -e '$a="abcdeabCde"; $p="b(.)d"; $r="_\$1\$1_"; $a=~s/$p/$r/gee; print "$a\n"'
Scalar found where operator expected at (eval 1) line 1, near "$1$1"
    (Missing operator before $1?)
Bareword found where operator expected at (eval 1) line 1, near "$1_"
    (Missing operator before _?)
Scalar found where operator expected at (eval 2) line 1, near "$1$1"
    (Missing operator before $1?)
Bareword found where operator expected at (eval 2) line 1, near "$1_"
    (Missing operator before _?)
aeae

ここで何が恋しいですか?


編集

どちら$p$r自分で書かれています。私に必要なのはそう、Perlコードに触れることなく交換する複数の同様の正規表現を行うことです$pし、$r別のデータファイルである必要があります。このファイルが後でC ++ / pythonコードで使用できることを願っています。$pとの例をいくつか示し$rます。

^(.*\D)?((19|18|20)\d\d)年   $1$2<digits>年
^(.*\D)?(0\d)年  $1$2<digits>年
([TKZGD])(\d+)/(\d+)([^\d/])    $1$2<digits>$3<digits>$4
([^/TKZGD\d])(\d+)/(\d+)([^/\d])    $1$3分之$2$4
家賃

では$p="b(.)d";、あなたはリテラル文字で文字列を取得していますb(.)d一般に、正規表現パターンは引用符で囲まれた文字列に保存されず、正規表現で期待される意味を持たない場合があります。ただし、最後の参照してください

これがqr演算子の目的です$p = qr/b(.)d/;。文字列を正規表現として形成します。

交換部品と/eeについては、$r最初に評価されて、が生成され_$1$1_、それがコードとして評価されるという問題があります。残念ながら、それは有効なPerlコードではありません。_裸の単語で、でも$1$1、それ自体(例えば、有効ではありません$1 . $1でしょう)。

提供例$rHAVE $NSは、様々な方法でテキストを混合しました。これを解析する1つの方法は$N、文字列からの順序を維持するリストに他のすべてを抽出することです。次に、それを有効なコードとなる文字列に処理できます。たとえば、

'$1_$2$3other'  -->  $1 . '_' . $2 . $3 . 'other'

これは、評価できる有効なPerlコードです。

これを分割する部分は、セパレータパターンでのスプリットのキャプチャによって支援されます。

sub repl {
    my ($r) = @_;

    my @terms = grep { $_ } split /(\$\d)/, $r;

    return join '.', map { /^\$/ ? $_ : q(') . $_ . q(') } @terms;
}

$var =~ s/$p/repl($r)/gee;

のパターンでキャプチャ/(...)/するsplitと、セパレータはリストの一部として返されます。したがって、これは、元の順序で、すべて(末尾の空白を除く)が保持された、$rいずれか$Nまたは他の用語の配列から抽出されます。これには、可能性のある(先頭の)空の文字列が含まれるため、それらを除外する必要があります。

次に、$Ns以外すべての用語がでラップされる'...'ため、.上記の例のように、それらがすべて結合されると、有効なPerl式が取得されます。

次に/ee、この関数で文字列(上記など)を返し、有効なコードとして評価します。

ここでは/ee、外部入力での使用の安全性は問題ないと言われています。それでも、これは覚えておくべきことです。コメントでHåkonHæglandによって提供されたこの投稿を参照してください議論とともに、それはまた私たちをString :: Substitutionに導きます。その使用法は、この投稿で示されています。これにアプローチする別の方法はData :: Mungeからです。replace

の詳細については、この投稿/ee参照してください。いくつかの役立つ回答があります。


"b(.)d"正規表現パターンの使用に関する注意

この場合、parensとdotを使用すると、それらの特別な意味が維持されます。おかげkangshiyinこの初期の言及のために、とのホーコンHæglandそれを主張するため。ただし、これは特殊なケースです。二重引用符で囲まれた文字列は、補間が行われるため、多くのパターンを直接拒否します。たとえば、"\w"エスケープされただけですw(認識されないもの)。単一何補間がないよう、引用符は、動作するはずです。それでも、正規表現パターンとして使用することを目的とした文字列qrは、真の正規表現を取得しているため、を使用して形成するのが最適です。次に、すべての修飾子を使用することもできます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

正規表現を使用してPythonで文字列パターンを検索して置換する

分類Dev

文字列で正規表現パターンを検索し、OracleSQLで各オカレンスをそれ自体の派生として置き換えます。

分類Dev

テキストファイルでの検索と置換-正規表現変数パターンを使用

分類Dev

正規表現検索と正規表現ステートメントを含む変数文字列の置換

分類Dev

正規表現を使用して、ファイル内の文字列パターンを検索する前と後

分類Dev

Pythonを介してプロパティファイルの正規表現文字列を使用して正規表現パターンで検索する方法

分類Dev

正規表現を使用した文字列の検索と置換

分類Dev

正規表現を使用して、文字列内のパターンのすべてのインスタンスを検索して置換します

分類Dev

Vimで複数行のパターンに従って文字列を正規表現検索する方法は?

分類Dev

JavaScriptで動的(変数)文字列を正規表現パターンとして使用する

分類Dev

検索と置換で正規表現を使用する方法

分類Dev

GREPと正規表現を使用して複数の文字列を検索する

分類Dev

Windowsコマンドラインを使用して正規表現の検索と置換を実行する方法

分類Dev

Pythonと正規表現を使用して特定の文字列を検索する方法

分類Dev

sedと正規表現を使用して文字列を検索して置換する

分類Dev

置換の正規表現部分で変数を正規表現パターンに補間する方法は?

分類Dev

PHPの検索と正規表現パターンの置換

分類Dev

PHP:正規表現を使用して文字列内の配列パターンを検索する

分類Dev

文字列の最初と最後の置換を検索する正規表現

分類Dev

ダーツの正規表現パターンとして動的(可変)文字列を使用する

分類Dev

正規表現パターンluaを使用して文字列内の単語を検索する

分類Dev

Rの正規表現パターンとして動的(可変)文字列を使用する

分類Dev

文字列内の文字の複数のインスタンスを検索(/置換)する正規表現

分類Dev

正規表現を使用してパターンを検索するときの逆順エラーの範囲?

分類Dev

正規表現n番目の文字の出現ごとに検索して置換する方法

分類Dev

特定の文字列を検索して置換するPHP正規表現

分類Dev

RStudioの検索と置換機能で正規表現を使用して、キャプチャされたグループを小文字に置き換えます

分類Dev

正規表現パターンを変数として sed の代替を使用する方法は?

分類Dev

検索/置換で正規表現を使用して複数の一致を置換する

Related 関連記事

  1. 1

    正規表現を使用してPythonで文字列パターンを検索して置換する

  2. 2

    文字列で正規表現パターンを検索し、OracleSQLで各オカレンスをそれ自体の派生として置き換えます。

  3. 3

    テキストファイルでの検索と置換-正規表現変数パターンを使用

  4. 4

    正規表現検索と正規表現ステートメントを含む変数文字列の置換

  5. 5

    正規表現を使用して、ファイル内の文字列パターンを検索する前と後

  6. 6

    Pythonを介してプロパティファイルの正規表現文字列を使用して正規表現パターンで検索する方法

  7. 7

    正規表現を使用した文字列の検索と置換

  8. 8

    正規表現を使用して、文字列内のパターンのすべてのインスタンスを検索して置換します

  9. 9

    Vimで複数行のパターンに従って文字列を正規表現検索する方法は?

  10. 10

    JavaScriptで動的(変数)文字列を正規表現パターンとして使用する

  11. 11

    検索と置換で正規表現を使用する方法

  12. 12

    GREPと正規表現を使用して複数の文字列を検索する

  13. 13

    Windowsコマンドラインを使用して正規表現の検索と置換を実行する方法

  14. 14

    Pythonと正規表現を使用して特定の文字列を検索する方法

  15. 15

    sedと正規表現を使用して文字列を検索して置換する

  16. 16

    置換の正規表現部分で変数を正規表現パターンに補間する方法は?

  17. 17

    PHPの検索と正規表現パターンの置換

  18. 18

    PHP:正規表現を使用して文字列内の配列パターンを検索する

  19. 19

    文字列の最初と最後の置換を検索する正規表現

  20. 20

    ダーツの正規表現パターンとして動的(可変)文字列を使用する

  21. 21

    正規表現パターンluaを使用して文字列内の単語を検索する

  22. 22

    Rの正規表現パターンとして動的(可変)文字列を使用する

  23. 23

    文字列内の文字の複数のインスタンスを検索(/置換)する正規表現

  24. 24

    正規表現を使用してパターンを検索するときの逆順エラーの範囲?

  25. 25

    正規表現n番目の文字の出現ごとに検索して置換する方法

  26. 26

    特定の文字列を検索して置換するPHP正規表現

  27. 27

    RStudioの検索と置換機能で正規表現を使用して、キャプチャされたグループを小文字に置き換えます

  28. 28

    正規表現パターンを変数として sed の代替を使用する方法は?

  29. 29

    検索/置換で正規表現を使用して複数の一致を置換する

ホットタグ

アーカイブ