2012-02-29 5 views
2

예제 입력에서 실행하려는 다음 정규 표현식을 사용하여 숫자와 분수를 모두 바꿉니다 (숫자를 곱해야합니다.)을 선택합니다 다음 numbersRegex 숫자 만 포함 된 라인에서 실행하는 데 필요한분수를 분수로 대체 정규 표현식, 숫자가 숫자 정규 표현식

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

을 (내가) numbersRegex를 사용하여 아래의 예를 입력에서 그들을 표시했다.

fractionsRegex는 분수 만 포함 된 줄에서 실행해야합니다 (fractionsRegex를 사용하여 밑줄 입력 예제에 표시했습니다).

곱셈 방법이 서로 다른 두 가지가 필요합니다. 그래서 str.replace를 두 번 실행합니다. 하나는 모든 분수를 곱하고 다른 하나는 모든 수를 곱합니다.

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

불행하게도 정수 부분과 소수 부분을 대체하는 얻을 수있는 자바 스크립트 정규 표현식을 계산 ~ 하지마. 부정적인 lookbehinds를 지원하므로 숫자 만 찾고있을 때는 분수에 오 탐지 (false positive)가 나타납니다. 당신이 분수에서 숫자의 일부를 따기 종료됩니다, 그래서 같은 말을 할 수있는 방법 ...

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

는 자바 스크립트 ... 없습니다.

이 텍스트는 \ 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");