正则表达式中的字符后,然后再选择
基本上我试图让一点正则表达式的做到以下几点...我有一些数据,我需要分割,样本数据是这样的:正则表达式中的字符后,然后再选择
Brand Name - Product Name
Another Brand - Shoe Laces
Heinz - Bakes Beans
我希望能够选择品牌名称或产品名称,但似乎无法在正则表达式中捕捉“ - ”部分。有人告诉我我错过了什么?我的正则表达式很基础。
编辑:我正在将数据库导出到电子表格,格式化并通过CSV导入到新系统。旧系统使用了上面的品牌名称 - 产品名称方法,因为新的方法使用两个单独的字段。理想情况下,我想尝试在电子表格公式中隐藏一些正则表达式,但现在我认为用脚本处理这个问题会更容易。可能PHP虽然不排除Javascript。
你不需要一个正则表达式 - 一个简单的split
就足够了。
实施例在python:
#!/usr/bin/env python
from string import strip
s = """
Brand Name - Product Name
Another Brand - Shoe Laces
Heinz - Bakes Beans
"""
for line in s.split('\n'):
try:
brand, product = map(strip, line.split('-'))
print 'Brand:', brand, '| Product:', product
except:
pass
收率:
Brand: Brand Name | Product: Product Name
Brand: Another Brand | Product: Shoe Laces
Brand: Heinz | Product: Bakes Beans
PHP版本:
<?php
$s = <<<EOM
Brand Name - Product Name
Another Brand - Shoe Laces
Heinz - Bakes Beans
EOM;
foreach (split("\n", $s) as $line) {
list($brand, $product) = split("-", $line, 2);
echo "Brand: " . trim($brand) . " | Product: " . trim($product) . "\n";
}
?>
红宝石VERSI于:
#!/usr/bin/env ruby
s = "
Brand Name - Product Name
Another Brand - Shoe Laces
Heinz - Bakes Beans
"
s.split("\n").each { |line|
brand, product = line.split("-").map{ |item| item.strip }
puts "Brand: #{brand} | Product: #{product}" if brand and product
}
当然,你会想要逐行应用正则表达式......“产品名称另一品牌”看起来并不正确。 – 2010-01-27 11:55:32
问题在我发布答案后进行了编辑;现在纠正... – miku 2010-01-27 12:02:45
你不需要正则表达式来完成这个任务。只需找到子字符串“-
”的索引。它是乐队名称之前的东西,后面是产品名称。
如果您知道数据是格式良好的,特别是该字符串-
- 一个空间,一个连字符,一个空间 - 只会发生在中间的分隔符,你可以使用(.*) - (.*)
来检索第一组中的品牌名称和第二组中的产品名称。
如果你的数据是这样构造的,最简单的方法是使用你的语言所使用的任何分割方法,然后在“ - ”上进行分割。例如,在Python
"Heinz - Bakes Beans".split("-")
无需复杂的正则表达式
所以,如果你的数据是在一个文件中
for line in open("file"):
brand,product=line.rstrip().split("-")
print brand, product
如果你使用PHP工作,你可以使用爆炸
$f = fopen("file","r");
if($f){
while(!feof($f)){
$line = fgets($f,4096);
list($brand,$product) = explode("-",$line);
echo "$brand - $product\n";
}
}
fclose($f);
假设字符串中不会有任何杂散的连字符(-
)(并且品牌名称等) ð只包含字母数字字符和空格 - 允许其他符号,将它们添加到字符类[]
),您可以使用下面的正则表达式:
^([\w\s]+?)\s*-\s*([\w\s]+)$
结果对象将是这样的:
$1
品牌$2
产品名称
您正在使用哪种语言? – kennytm 2010-01-27 11:52:50
对不起,我应该在帖子中加入我的目的。现在将其添加到编辑中。 – Leonard 2010-01-27 12:27:14