2012-01-19 3 views
0

나는 버그를 해결하는 방법을 알지 못하는 정규식 문제가 있습니다.여러 정규식 하위 패턴의 선택적 일치

텍스트가있는 입력란이 있는데 그 중 특정 값을 추출하고 싶습니다. 제목, 설명, 가격 및 특별 가격을 추출하고 싶습니다. 입력에 대한

예 : 일반 텍스트는 제목으로 우려 무엇

  • 다.
  • 내 해시 내에있는 모든 것 (# 설명이 여기에 있습니다 #)이 설명으로 간주됩니다.
  • $ 23.49는 가격으로 간주되며 % $ 19.99는 특별 가격과 일치합니다.

커피 스크립트 패턴 내가 사용 :

pattern = /// 
    ([^$]+) 
    (#(.+?)#+) 
    ([\$]\d+\. \d+) 
    ([\%\$]\d+\. \d+) 
    /// 
    params = [title,description,oldPrice,newPrice]=input_txt.match(pattern)[1..4] 

이 작동하지 않습니다. 주어진 시퀀스에서 모든 값을 입력하면 요청 된 하위 문자열을 제공해야합니다.

내가 제공하고자하는 것은 sequments가 제공되는 경우 (선택 사항이므로) 순서에 상관없이 ... 문자열의 선택적 시퀀스를 추출하는 방법은 무엇입니까? EDIT/// 나는 몇 가지 예를 제공

exmp1 :

Kindle #Amazon's ebook reader# $79.00 

title:Kindle 
description: Amazon's ebook reader 
oldPrice:$79.00 
로 추출해야 6,

exmp2 :

$100.00 Just dance 3 #for XBox# 

,174,515 압축 해제되어야한다 exmp3가
title:Nikes Sneaker's 
oldPrice:$109.00 
newPrice:$89.00 

으로이 추출되어야

Nike Sneaker's $109.00 %$89.00 

title: Just dance 3 
description: for XBox 
oldPrice:$100.00 

어떤 도움이 좋을 것 ...

+0

구문 분석하려는 문자열의 몇 가지 예를 제공해주십시오. 임의의 순서로 항목을 일치 시키려면 여러 개의 다른 정규 표현식을 사용해야합니다. – jfriend00

+0

몇 가지 예제 문자열을 제공했습니다 ... –

답변

4

일반 문법의 본질은 어려운 문제를 해결할 수 있습니다. 원래

  • 매치에서 (문자열 대체)

    1. 일치 /#(.+?)#+/ 및 결과 문자열을 제거 : 가장 간단한 해결책 주위를 작품으로 당신의 정규식 4 번 실행하는 것입니다/[\ % \ $] \ d +. \ d +/원래 문자열에서 결과 문자열을 제거하십시오.
    2. 일치/[\ $] \ d +. \ d +/... 그리고 패턴을 얻을 수 있습니다.
    3. 이제 원본에 남아있는 것은 제목입니다.
  • 1

    당신은이 경기의 각 별도의 조각을 제거 찾습니다이 코드를 사용할 수 있습니다 http://jsfiddle.net/jfriend00/d8NNr/ : 당신은 여기에 행동에 데모를 볼 수

    function extractParts(str) { 
        var parts = {}; 
    
        function removePiece(re) { 
         var result; 
         var matches = str.match(re); 
         if (matches) { 
          result = matches[1]; 
          str = str.replace(re, ""); 
         } 
         return(result); 
        } 
    
        // find and remove each piece we're looking for 
        parts.description = removePiece(/#([^#]+)#/);  // #text# 
        parts.oldPrice = removePiece(/[^%](\$\d+\.\d+)/); // $4.56 
        parts.newPrice = removePiece(/%(\$\d+\.\d+)/);  // %$3.78 
        // fix up whitespace 
        parts.title = str.replace(/\s+/g, " ").replace(/^\s+/, "").replace(/\s+$/, ""); 
        return(parts); 
    } 
    
    var pieces = extractParts("Kindle #Amazon's ebook reader# $79.00"); 
    

    을합니다.