0

javascript (jquery やライブラリではなくプレーンな js) を使用して、正規表現でアイテムを照合し、それらに対して操作を実行しようとしています。

基本的には、帝国単位からメートル法に変換するスクリプトを作成しようとしています。これが私が持っているものです

    var a = [
            [/([0-9\/]+) (pound[s]?|lb)/ig, 45, "g"],
        ];
    function convert(){
        var t = document.body.innerHTML;
        for(var j = 0; j < a.length; j++){
            var m = t.match(a[j][0]);
            for(var i = 0; i < 1; i++){
                var decimal = eval(m[i].split(' ')[0]);
                t = t.replace(m[i],(decimal * a[j][1]) + a[j][2]);
            }
        }
        document.body.innerHTML = t;
    }

これは機能しますが、特定の試合では試合の一部を返したいと考えています。たとえば、砂糖 1 カップと小麦粉 1 カップの変換は 1 つありますが、それぞれに多くの種類があるため、元の文字列の一部を返したいと考えています。

私が持っている場合

1 cup wholemeal flour

これを次の行に沿って正規表現と一致させたい

/(([0-9\/]+) ((wholemeal |plain |white |strong |self-raising )?flour))/ig

... 最初の部分のみを操作し、全体をトークンを含む文字列に置き換えます。

            //match  value   * conversion  + unit    + string token
t - t.replace(m[i], (decimal * a[j][1])    + a[j][2] + m[i][2]);

そして最後に出てくる

150g wholemeal flour

ただし、m[i] は文字列であり、php や c# のように一致するグループにアクセスする方法が見つかりません。

注: これらの種類の小麦粉のいくつかは個別の変換が必要であることは認識していますが、それでもその方法を知りたい.

4

3 に答える 3

0

あなたはこれを行うことができます。次のような JavaScript 置換関数の「コールバック」機能を使用したいようです。

t.replace(m[i],function(match, contents, offset, fullstring){ 
return (decimal * a[j][1])    + a[j][2] + m[i][2])
});

その無名関数を使用すると、一致したグループをより正確に操作することができます。

それでも解決しない場合は、「$1-9」構造を認識していますか? 例えば

t.replace(/(([0-9\/]+) ((wholemeal |plain |white |strong |self-raising )?flour))/ig,'$1');

これにより、各グループが最初の括弧で囲まれたグループ '(xxx)' にあるものだけに置き換えられます。ただし、これらは PHP でも標準です。'$1​​' 文字列に対して必要な操作をさらに実行できます。

それが役立つことを願っています!- ポイントを逃した場合は、コメントして明確にしてください。

于 2013-04-07T20:45:46.457 に答える