0

以下のようなトークン化された文字列の置換を行っています。

var myString = "I would like to replace the following token <<start<arg1,arg2 >>> in this string"
OR  
var myString = "The expression has an optional <<start<arg1,arg2,arg3 >>> third argument" 

トークン内には、キャプチャして正規表現コールバック関数に渡したい 2 つまたは 3 つの英数字文字列があります。

myString.replace(regExExpression, function(m, arg1, arg2, arg3) { 
   return foo(arg1, arg2, arg3); 
});

myString の両方のバージョン、キャプチャ arg1、arg2、およびオプションの arg3 に一致する正規表現はどれですか?

4

3 に答える 3

1

説明

各引数をそれぞれグループ 1 2 または 3 に入れるこれを試してください。この regexplanet サンプルも参照してください

  • 各属性グループはで始まり、<<start<で終わります>>>
  • 開始タグと終了タグの間のカンマ区切りの部分文字列の 2 ~ 3 グループ間で一致し(?:,([^,>]*))?、2 番目と 3 番目のグループの間に挿入することで、追加のグループを一致させることができます。
  • トークン 3 はオプションです

<<start<([^,>]*)(?:,([^,>]*))(?:,([^>]*))?(?=>>>)

ここに画像の説明を入力

于 2013-05-15T03:27:40.467 に答える
0

私はあなたの特定のケースを扱います:

  /<<\s*start\s*<\s*(?:([^,>]*))?(?:\s*,\s*([^,>]*))?(?:\s*,\s*([^>]*))?>>>/i

通常、正規表現に \s* をふりかけて、自由形式の入力を受け入れます。それらが必要ないことが確実な場合は、それらを削除してください。単一の RE を記述して任意の数の引数を処理できるとは思いませんが、最大 3 つを指定しました。

私の推奨は、次の 2 段階のソリューションを使用することです。これにより、任意の数の引数の柔軟性がさらに高まります。

  .replace (/<<\s*start\s*<\s*(.*)?\s*>>>/i, function (m, args) {
     args = args.split (/\s*,\s*/); // array of args
     return  ('{{[' + args.length + '] : ' + args.join (', ') + '}}');
  });

そして、次のように使用されます:

"I would like to replace the following token <<start<arg1,arg2 , arg3>>> in this string".replace (/<<\s*start\s*<\s*(.*)?\s*>>>/i, function (m, args) {
         args = args.split (/\s*,\s*/); // arbitrary number of
         return  ('{{[' + args.length + '] : ' + args.join (', ') + '}}');
      });

その結果 :

"I would like to replace the following token {{[3] : arg1, arg2, arg3}} in this string"
于 2013-05-15T03:51:17.657 に答える