необязательное соответствие нескольких шаблонов регулярных выражений - PullRequest
0 голосов
/ 20 января 2012

У меня есть проблема с регулярным выражением, которая меня беспокоит, и я понятия не имею, как ее решить.

У меня есть поле ввода с текстом, и мне нравится извлекать из него определенные значения. Я хотел бы извлечь название, описание, цену и специальную цену.

Примеры для ввода:

  • все, что представляет собой простой текст, относится к заголовку.
  • все, что находится внутри хешей (здесь идет #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 ]

4 голосов
/ 20 января 2012

Природа обычных грамматик затрудняет решение вашей проблемы.В качестве обходного пути самым простым решением было бы просто выполнить ваше регулярное выражение 4 раза:

  1. Match /#(.+?)#+/ и удалить результирующую строку (string replace) из исходного
  2. Совпадение / [\% \ $] \ d +.\ d + / и удалите результирующую строку из исходного
  3. Match / [\ $] \ d +.\ d + / и ... вы получаете шаблон
  4. Теперь в оригинале остается название.
1 голос
/ 21 января 2012

Вы можете использовать этот код, который ищет удаляет каждый отдельный фрагмент совпадений:

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/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...