4

RegExp は、一致したパターンをタグ付き式と呼ばれるものを含む置換で置き換えることができます

例:

var s = "... some string with full things...";
s = s.replace(/(some|full)/gi, "\"aw$1\");

その結果、

'... "awsome" string with "awfull" things...'

somefullが一致し、置換された文字列の $1 は、この場合、一致したTagged Expressionを波括弧内に反映するため、人生はクールです。正確にsomeまたはfullのみです。

さて、アイデアが浮かんだので、次のことを行うアイデアを探しています。

前の文字列:

"{timeOfEffect: 3*24*60*60 }"

後の文字列

"{timeOfEffect: 259200}"

値は人間によって (60 秒 * 60 分 * 24 時間)*3 => 3 日 (聞かないでください。クライアントの要求) のような把握可能な用語に編集されるため、そのように表されますが、259200 のようなコンピューター用語で読み取られます。秒であり、そのパターンの多くの発生を含む可能性があります。

$1 と $2 を乗算する置換式を作成したり、$1 と $2 を関数に渡したり、$1 * $2 を評価コンテキストに渡したりしようと考えていましたが、関数を作成して手動で行う必要があります。

私が得た最も近いものは

var x = /([0-9]*)\s\*\s([0-9]*)/g
  , r = function(m){
           return m[1] * m[2];
        }
while (m = x.exec(s))
  s = s.replace( x, r(m));

最初の match のみをexec返すので、これは少し面倒です。replaceステートメントで処理した後、次の検索は文字列の先頭から再開されます-これは長さ60Kの文字列です...

適切な解決策は、次のいずれかです: a) インデックスから始まる一致を実行します (そのための新しい部分文字列を作成せずに) b) 評価を可能にする置換式を提供します

別のアプローチは、文字列をトークン化し、それをビット単位で処理することです。これはRegExp、多くのコードと労力がかかる完全な代替手段です。その場合、パフォーマンスのペナルティを受け入れるか、より良い戦いをするかします。この要件のより良い代替案について...

誰か助けて?

4

2 に答える 2

7
var s = "timeOfEffect: 3*24*60*60 var: 6*8 ";
var r = new RegExp("([0-9*+-/]{0,}[0-9])","g");
s = s.replace(r,function(match){ return eval(match); });
alert(s)
于 2011-03-04T09:56:30.967 に答える
5
var str = '{timeOfEffect: 3*24*60*60}, {timeOfEffect: 1+7}, {timeOfEffect: 20-3}, {timeOfEffect: 3 / 0}';

var result = str.replace(/\s([\d\/\*\-\+\s]+?)\}/g, function(all, match) {
    return eval(match) + '}';
});

document.body.innerHTML = result;
// {timeOfEffect:259200}, {timeOfEffect:8}, {timeOfEffect:17}, {timeOfEffect:Infinity}

jsFiddle .

eval()0-9文字列には、\n\t/、のみが含まれていることが保証されているため、安全に使用*でき-ます+。のようなものがあるかもしれないと思ってましMath.parse()が、ありません。

括弧を必要とするより複雑な計算が必要な場合は、エスケープされた(and)を正規表現の文字範囲に追加するだけです。

于 2011-03-04T09:20:44.227 に答える