0

次のサンプルテキストがあり、「[core]」を置き換えたいと思います。他のものと交換したいのですが、テキストマーカーの間にない場合にのみ置き換えたいと思います'(SQL):

PRINT'[core]。[dbo]。[FunctionX]'+[core]。[dbo]。[FunctionX]+'。'の結果

EXECUTE[コア]。[dbo]。[FunctionX]

結果は次のようになります。

PRINT'[core]。[dbo]。[FunctionX]'+[extended]。[dbo]。[FunctionX]+'。'の結果

EXECUTE[拡張]。[dbo]。[FunctionX]

誰かがこれを理解してくれることを願っています。これは正規表現で解決できますか?

RegLoveで

ケビン

4

2 に答える 2

0

解決策(javascript)は次のとおりです。

str.replace(/('[^']*'.*)*\[core\]/g, "$1[extended]");

実際に見てください

于 2010-07-06T15:21:22.220 に答える
0

単一のステップではなく、通常のテキストエディタでもありません。SQLが構文的に有効な場合は、次のように実行できます。

まず、SQLからすべての文字列を削除し、プレースホルダーに置き換えます。次に、他のものに置き換え[core]ます。次に、手順1のプレースホルダーのテキストを復元します。

  • '(?:''|[^'])+'withのすべての出現箇所を検索します'n'。ここnで、はインデックス番号(一致の番号)です。一致を。と同じ番号の配列に格納しnます。これにより、入力からすべてのSQL文字列が削除され、SQL自体を無効にすることなく、無害な置換と交換されます。
  • の置き換えを行い[core]ます。正規表現は必要ありません。ここでは通常の検索と置換で十分です。
  • 配列を繰り返し、プレースホルダー'1'を最初の配列項目に置き換え'2'、2番目の項目を最大で置き換えnます。これで、元の文字列が復元されました。

正規表現は、次のように説明しています。

'#一重引用符
(?:#非キャプチャグループを開始します
  '' | [^']#2つの一重引用符、または一重引用符以外のもの
)+#グループを終了し、少なくとも1回繰り返します
'#一重引用符

JavaScriptこれは次のようになります。

var sql = 'your long SQL code';
var str = [];

// step 1 - remove everything that looks like an SQL string
var newSql = sql.replace(/'(?:''|[^'])+'/g, function(m) { 
  str.push(m);
  return "'"+(str.length-1)+"'";
});

// step 2 - actual replacement (JavaScript replace is regex-only)
newSql = newSql.replace(/\[core\]/g, "[new-core]");

// step 3 - restore all original strings
for (var i=0; i<str.length; i++){
  newSql = newSql.replace("'"+i+"'", str[i]);
}

// done.
于 2010-07-06T15:07:36.597 に答える