0

したがって、次のようなコードで関数のすべての呼び出しを見つける必要があります。 _t() のこれを行う方法はありますか?

4

2 に答える 2

1

プログラミングとは、仕事に適したツールを選択することであり、正規表現は、関数の最上位部分のみを照合するための適切なツールではありません。ただし、最上位部分を取得するプログラムを作成するのはかなり単純なタスクです。これを実現する C++ で作成されたプログラムを次に示します。変数「str」に格納されている文字列を解析し、「func」に格納されている関数の最上位部分を見つけるため、この場合は「_t(」を見つけます。

#include <iostream>
#include <string>

using namespace std;

int main () {
    string str = "_t(another, anything)\nanything0 _t(anything, _t(anything2))\n_t(anything)\n_m(this, should, not, match)\n_t(anything1, anything2)";
    string func = "_t(";

    int pos = 0;
    int lastPos = 0;

    while (pos != -1) {
      pos = str.find (func, lastPos);

      if (pos == -1) break;

      int depth = 1;
      string tmp;

      pos += func.size ();
      while (depth > 0) {
        if (str[pos] == '(') {
          depth++;
        }
        else if (str[pos] == ')') {
          depth--;
        }

        if (depth != 0) {
          tmp += str[pos];
        }
        pos++;
      }

      cout << tmp << endl;

      lastPos = pos;
    }

    return 0;
}

次の入力が与えられた場合 (文字列 "str" に格納されます):

_t(another, anything)
anything0 _t(anything, _t(anything2))
_t(anything)
_m(this, should, not, match)
_t(anything1, anything2)

出力は次のとおりです。

another, anything
anything, _t(anything2)
anything
anything1, anything2


更新: ネストされたアイテムを扱う場合、正規表現は実際には最善の解決策ではないと思いますが、これは必要なものにはうまくいくかもしれません:

_t\(([\w\d _\(\),]+)?\)

PHPでの例を次に示します(別のコメントで使用していると述べたように):

<?php 
$pattern = '/_t\(([\w\d _\(\),]+)?\)/';
$subject = '_t(another, anything)\nanything0 _t(anything, _t(anything2))\n_t(anything)\n_m(this, should, not, match)\n_t(anything1, anything2)';

preg_match_all ($pattern, $subject, $matches);

print_r ($matches);
?>

これからの出力は次のとおりです。

Array
(
    [0] => Array
        (
            [0] => _t(another, anything)
            [1] => _t(anything, _t(anything2))
            [2] => _t(anything)
            [3] => _t(anything1, anything2)
        )

    [1] => Array
        (
            [0] => another, anything
            [1] => anything, _t(anything2)
            [2] => anything
            [3] => anything1, anything2
        )

)

そして、それは $matches[1] 配列で探しているものと一致するようです。

于 2012-09-03T07:10:47.187 に答える
0

関数名のみを一致させたいのか、パラメーターを削除したいのか (非トップレベルの呼び出しを含む) はわかりません。とにかく、ここに出力する置換正規表現があります:

_t()
_t()
_t()

_t(anything, _t(anything2))
_t(anything)
_t(anything1, anything2)

入力として:

/(_t\().*(\))/\1\2/g
于 2012-09-03T06:51:39.300 に答える