我有一个正则表达式问题,这让我很烦恼,并且不知道如何解决它。
我有一个带文本的输入字段,我喜欢从中提取某些值。 我想提取标题,描述,价格和特价。
输入示例:
我正在使用的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
任何帮助都会很棒......
答案 0 :(得分:4)
常规语法的本质使得解决问题变得困难。解决最简单的解决方案就是执行你的正则表达式4次:
答案 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/。