正则表达式中的字符后,然后再选择

问题描述:

基本上我试图让一点正则表达式的做到以下几点...我有一些数据,我需要分割,样本数据是这样的:正则表达式中的字符后,然后再选择

Brand Name - Product Name 
Another Brand - Shoe Laces 
Heinz - Bakes Beans 

我希望能够选择品牌名称或产品名称,但似乎无法在正则表达式中捕捉“ - ”部分。有人告诉我我错过了什么?我的正则表达式很基础。

编辑:我正在将数据库导出到电子表格,格式化并通过CSV导入到新系统。旧系统使用了上面的品牌名称 - 产品名称方法,因为新的方法使用两个单独的字段。理想情况下,我想尝试在电子表格公式中隐藏一些正则表达式,但现在我认为用脚本处理这个问题会更容易。可能PHP虽然不排除Javascript。

+3

您正在使用哪种语言? – kennytm 2010-01-27 11:52:50

+0

对不起,我应该在帖子中加入我的目的。现在将其添加到编辑中。 – Leonard 2010-01-27 12:27:14

你不需要一个正则表达式 - 一个简单的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 
} 
+0

当然,你会想要逐行应用正则表达式......“产品名称另一品牌”看起来并不正确。 – 2010-01-27 11:55:32

+0

问题在我发布答案后进行了编辑;现在纠正... – 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产品名称