2012-01-19 32 views
0

我有一個正則表達式問題,它讓我感到困惑,並且不知道如何解決它。多個正則表達式子模式的可選匹配

我有一個文本輸入字段,我喜歡從中提取某些值。 我想提取標題,描述,價格和特價。對於輸入

例子:

  • 一切什麼是純文本而言的稱號。
  • 散列內的所有內容(#description goes here#)被視爲描述。
  • 23.49美元被視爲價格,19.99美元將與特價相匹配。

的CoffeeScript的模式我用:

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

它不工作。它應該工作,如果我輸入給定的序列中的所有值,我也必須提供一個問題的子字符串。

我想吃點什麼是提取sequments的能力,如果提供(因此可選)和無序列的事...... 我怎麼能提取字符串的可選序列... 編輯/ // 我提供一些實例

exmp1:

Kindle #Amazon's ebook reader# $79.00 

這應該被提取爲

title:Kindle 
description: Amazon's ebook reader 
oldPrice:$79.00 

exmp2:

$100.00 Just dance 3 #for XBox# 

這應該被提取到

Nike Sneaker's $109.00 %$89.00 

作爲

title:Nikes Sneaker's 
oldPrice:$109.00 
newPrice:$89.00 

exmp3這應該被提取

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

任何幫助將是巨大的......

+0

請提供您想要解析的字符串的幾個示例。如果你想以任何順序匹配事物,你將不得不使用多個不同的正則表達式。 – jfriend00

+0

我提供了一些示例字符串... –

回答

4

正規文法的性質使得它很難解決您的問題。作爲一個變通的最簡單的解決辦法是隻執行您正則表達式4倍:從原來的

  • 比賽

    1. 比賽/#(.+?)#+/並移除結果字符串(字符串替換)/[\%\ $] \ d +。 \ d + /並從原始
    2. 匹配/ [\ $] \ d +中刪除結果字符串。 \ d + /和...你得到的模式
    3. 現在仍然是原來的標題。
  • 1

    您可以使用此代碼,查找一個刪除匹配每個單獨的一塊:

    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"); 
    

    而且,您可以在這裏的行動看到一個演示:http://jsfiddle.net/jfriend00/d8NNr/