在正则表达式中的字符之前选择

时间:2010-01-27 11:47:12

标签: php regex csv spreadsheet

基本上我正在尝试使用一些正则表达式来执行以下操作...我需要拆分一些数据,示例数据如下所示:

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

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

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

5 个答案:

答案 0 :(得分:1)

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

?>

Ruby版本:

#!/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
}

答案 1 :(得分:1)

如果您的数据结构如此,最简单的方法是使用您的语言具有的任何分割方法,然后对“ - ”进行拆分。例如在Python中

"Heinz - Bakes Beans".split("-")

不需要复杂的正则表达式

因此,如果您的数据位于文件中

for line in open("file"):
    brand,product=line.rstrip().split("-")
    print brand, product

如果您使用PHP,则可以使用explode

$f = fopen("file","r");
if($f){
     while( !feof($f) ){
        $line = fgets($f,4096);
        list($brand,$product) = explode("-",$line);
        echo "$brand - $product\n";
     }
}
fclose($f);

答案 2 :(得分:1)

假设字符串中不会有任何杂散连字符(-)(并且品牌名称等仅包含字母数字字符和空格 - 要允许其他符号,请将它们添加到字符类{ {1}}),您可以使用以下正则表达式:

[]

结果对象如下所示:

^([\w\s]+?)\s*-\s*([\w\s]+)$ 品牌名称
$1产品名称

答案 3 :(得分:0)

此任务不需要正则表达式。只需找到子串“-”的索引即可。在它是乐队名称之前的东西,以及之后是产品名称。

答案 4 :(得分:0)

如果您知道要格式良好的数据,特别是字符串- - 一个空格,一个连字符,一个空格 - 只会作为中间的分隔符出现,您可以使用(.*) - (.*)检索第一组中的品牌名称和第二组中的产品名称。