2012-02-29 19 views
2

数字入力と分数入力の両方を置き換えるために、次の正規表現を実行したいと思います。 )を選択します:分数を端数で置き換えます。正規表現、数字で数字を正規表現

numbersRegex = /[0-9]+(?:\.[0-9]*)?/g; 
fractionsRegex = /((\d+)\/(\d+))/g; 

numbersRegexは数字のみを含む行上で実行する必要があります(私はnumbersRegexを使用して下の例の入力でそれらをマーク)。

fractionsRegexは、分数だけを含む行で実行する必要があります(fractionsRegexを使用して下の例の入力でそれらをマークしました)。

私は乗算方法が異なるので2つの異なるものにする必要があるので、str.replaceを2回実行します.1回はすべての分数を掛け、もう1回はすべての数を掛けます。ここで

は、例えば、入力された:

1 1/2 oz. white rum (fractionsRegex) 
1/2 lime, cut in 4 wedges (fractionsRegex) 
10 mint leaves, fresh (numbersRegex) 
2 tbsp. white sugar (numbersRegex) 
1 cup ice cubes (numbersRegex) 
1/2 cup club soda (fractionsRegex) 

が可能ということですか?

感謝

UPDATE

これは、私は現在、(それがクリーンアップする必要があり、私はそれはまた、最適化することができます確信している)を使用してい関数である。

function _increaseServings(target, initialServings, newServings) { 
    target.html(originalIngredientsHTML); 

    target.find('li').each(function(i) { 
     var currentLine = $(this).text(); 
     var importantPart = currentLine.split(','); 

     var fractionsRegex = importantPart[0].match(/((\d+)\/(\d+))/g); 
     var lineHiddenFractions = importantPart[0] != null ? importantPart[0].replace(/([0-9]{1,})([\/]{1})([0-9]{1,})/g, "") : ""; 
     var numbersRegex = lineHiddenFractions.match(/([0-9]+(?:\.[0-9]*)?)/g); 

     var result = {}; 
     var strToReplace = ''; 

     if (fractionsRegex == null && numbersRegex == null) return; 

     if (fractionsRegex !== null && fractionsRegex.length > 0) { 
      result.fraction = fractionsRegex[0]; 

      strToReplace = result.fraction; 
     } 

     if (numbersRegex !== null && numbersRegex.length > 0) { 
      result.number = parseInt(numbersRegex[0]); 

      if(result.fraction) { 
       strToReplace = result.number + ' ' + strToReplace; 
      } else { 
       strToReplace = result.number; 
      } 
     } 

     if(result.fraction) { 
      var fraction = result.fraction.split('/'); 
      if(result.number && result.fraction) { 
       result.decimal = parseInt(result.number) + parseInt(fraction[0])/parseInt(fraction[1]); 
      } else { 
       result.decimal = parseInt(fraction[0])/parseInt(fraction[1]);     
      } 
     } else { 
      result.decimal = parseInt(result.number); 
     } 

     result.stringToReplace = strToReplace; 

     var newValue = result.decimal * (newServings/initialServings); 

     if(newValue % 1 != 0) { 
      var values = String(newValue).split('.'); 

      var checkValue = String(values[1]).slice(0,1); 
      var integerPart = Math.floor(newValue); 

      if(checkValue == 2) { 
       // 25 
       newValue = integerPart + ' 1/4'; 
      } else if(checkValue == 3) { 
       // 33 
       newValue = integerPart + ' 1/3'; 
      } else if(checkValue == 5) { 
       // 50 
       newValue = integerPart + ' 1/2'; 
      } else if(checkValue == 6) { 
       // 66 
       newValue = integerPart + ' 2/3'; 
      } else if(checkValue == 7) { 
       // 75 
       newValue = integerPart + ' 3/4'; 
      } 

      if(integerPart == 0) newValue = newValue.slice(2, newValue.length); 
     } 

     currentLine = currentLine.replace(strToReplace, newValue); 

     $(this).text(currentLine); 
    }); 
} 
+0

ご質問が分かりませんか。分数線から分数を抽出し、分数なしの線から番号を抽出する** 1 **正規表現が必要ですか? –

+0

私は本当にあなたの質問を得ることはありません。文字列に小数点または数字が含まれているかどうかを判断して、正規表現のどれを使用するかを決定しますか?もしそうなら、文字列に小数部が含まれているかどうか最初に小数部regexpでテストします。テストが失敗した場合は、数正規表現を使用します。それでも問題が解決しない場合は、質問を明確にしてください。 :) – tleilax

+0

私は、より良い説明のために質問を編集しました –

答えて

1

残念ながら、整数部と小数部を交換するために取得するJavaScriptの正規表現を計算しますしないでくださいネガティブなルックバックをサポートしているので、数字だけを検索しているときには小数点数に誤認があります。あなたは画分からの数字の一部を拾ってしまいますので、何かを言っても仕方...

"/(?<!\/)([0-9])/" 

は、JavaScriptで...ありません。

は、あなたのテキストは、\ nはちょうどテストのための目的で終端されていると仮定すると:あなたはこのようなもので結果出し偽物に持って

var t = "1 1/2 oz. white rum (fractionsRegex)\n1/2 lime, cut in 4 wedges (fractionsRegex)\n10 mint leaves, fresh (numbersRegex)\n2 tbsp. white sugar (numbersRegex)\n1 cup ice cubes (numbersRegex)\n1/2 cup club soda (fractionsRegex)"; 
var ary = t.split("\n"); 

for (var i = 0; i < ary.length; i++) { 
    var fractionsRegex = ary[i].match(/((\d+)\/(\d+))/g); 
    var lineHiddenFractions = ary[i] != null ? ary[i].replace(/([0-9]{1,})([\/]{1})([0-9]{1,})/g, "") : ""; 
    var numbersRegex = lineHiddenFractions.match(/([0-9]+(?:\.[0-9]*)?)/g); 
    if (fractionsRegex !== null && fractionsRegex.length > 0) { 
     // We have a fraction for this line. 
     for (var j = 0; j < fractionsRegex.length; j++) { 
      alert("Fraction on line " + i + ": " + fractionsRegex[j]); 
     } 
    } 
    if (numbersRegex !== null && numbersRegex.length > 0) { 
     // We have a number for this line. 
     for (var k = 0; k < numbersRegex.length; k++) { 
      alert("Number on line " + i + ": " + numbersRegex[k]); 
     } 
    } 
} 

私はこの方法はあなたのために最大限の柔軟性を提供していますだと思いますあなたがしたいこと。各行について、すべての分数の配列とすべての数字の配列を取得します。ブール値を置いて、行に数値と分数の両方があるかどうか、またはどちらか一方だけをチェックすることができます。計算を実行する必要がある場合は、各行の分数と数値の配列から式を作成できます。

+0

+1私はすべての提案をテストしました。私の最終的な機能を整理して最適化する必要がありますが、現在は私が望んでいることをやっています。誰にもありがとう –

0

私はこのアプローチが必要なことをすると思います。 getQuantityを呼び出すと、プロパティnumberfractionを含む場合と含まない場合があるオブジェクトが返されます。その後、結果を取得すると、ロジックを実行してその結果を判断することができます。

function getQuantity(recipe){ 
    var regex = /^(([1-9]+\d*\s)?((\d+)\/(\d+)\s)?).*$/g; 
    var results = regex.exec(recipe); 
    if(results[2] && results[5]){ 
     return {number: Number(results[2]), fraction: Number(results[4])/Number(results[5])}; 
    } if(results[5]){ 
     return {fraction: Number(results[4])/Number(results[5])}; 
    } else{ 
     return {number: Number(results[2])}; 
    } 
} 

getQuantity("1 1/2 oz. white rum"); // {number: 1, fraction: 0.5} 
getQuantity("1/2 lime, cut in 4 wedges"); // {fraction: 0.5} 
getQuantity("10 mint leaves, fresh"); // {number: 10} 
getQuantity("2 tbsp. white sugar"); // {number: 2} 
getQuantity("1 cup ice cubes"); // {number: 1} 
getQuantity("1/2 cup club soda"); // {fraction: 0.5} 
1

function measure(string){ 
    var match = string.match(/^\d+(\s*\d*(\/+\d+))*/); 
    if(match){ 
    match = match[0].split(" "); 
    var m = 0; 
    while(match.length){ 
     m += eval(match.shift()); 
    } 
    return m; 
    } 
    return 0; 
} 

や、個別値

function get(string){ 
    var match = string.match(/^\d+(\s*\d*(\/+\d+))*/); 
    if(match){ 
    match = match[0].split(" "); 
    var m = 0; 
    while(match.length){ 
     m += eval(match.shift()); 
    } 
    return {integer:Math.floor(m), fraction:m-Math.floor(m)}; 
    } 
    return {integer:0, fraction:0}; 
} 

または別々

function replaceInteger(string, newInt){ 
    return string.replace(/^\d+\s+/, function(m, n){ 
    return newInt + " "; 
    }); 
} 

function replaceFraction(string, newFract){ 
    return string.replace(/^\d+\/+\d+\s+/, function(m, n){ 
    return newFract + " "; 
    }); 
} 

replaceInteger("10 mint leaves, fresh", "100"); 
replaceFraction("1/2 lime leaves, fresh", "1/3"); 
関連する問題