多个正则表达式子模式的可选匹配

时间:2012-01-19 22:56:45

标签: javascript regex coffeescript

我有一个正则表达式问题,这让我很烦恼,并且不知道如何解决它。

我有一个带文本的输入字段,我喜欢从中提取某些值。 我想提取标题,描述,价格和特价。

输入示例:

  • 所有关于纯文本的内容都与标题有关。
  • 哈希内的所有内容(#description在这里#)被认为是描述。
  • 23.49美元被视为价格,%19.99美元将与特价相符。

我正在使用的CoffeeScript模式:

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

它不起作用。如果我输入给定序列中的所有值,我也必须提供一个被询问的子字符串。

我想要的是能够在提供(如此可选)的情况下提取序列,无论顺序如何...... 如何提取字符串的可选序列... 编辑/// 我提供了一些例子

exmp1:

Kindle #Amazon's ebook reader# $79.00

这应该被提取为

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

exmp2:

Nike Sneaker's $109.00 %$89.00

这应该被提取为

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

exmp3:

$100.00 Just dance 3 #for XBox# 

这应该提取到

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

任何帮助都会很棒......

2 个答案:

答案 0 :(得分:4)

常规语法的本质使得解决问题变得困难。解决最简单的解决方案就是执行你的正则表达式4次:

  1. 匹配/#(.+?)#+/并从原始
  2. 中删除结果字符串(字符串替换)
  3. 匹配/ [\%\ $] \ d +。 \ d + /并从原始
  4. 中删除结果字符串
  5. 匹配/ [\ $] \ d +。 \ d + /和...你得到的模式
  6. 现在剩下的就是标题。

答案 1 :(得分: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/