Выбор до и после символа в регулярном выражении - PullRequest
0 голосов
/ 27 января 2010

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

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

Я хочу иметь возможность выбрать название бренда или название продукта, но я не могу сделать это, не поймав "-" в регулярном выражении. Кто-нибудь скажет мне, что я пропускаю? Мое регулярное выражение довольно простое.

РЕДАКТИРОВАТЬ: я экспортирую базу данных в электронную таблицу, форматирую ее и импортирую в новую систему через CSV. Старая система использовала метод фирменного наименования - название продукта, как указано выше, где в новой используется два отдельных поля. В идеале я хотел попробовать использовать регулярные выражения в формуле таблицы, но теперь я думаю, что будет проще справиться с этим с помощью скрипта. Вероятно, PHP, хотя Javascript не исключен.

Ответы [ 5 ]

1 голос
/ 27 января 2010

Предполагая, что в строке не будет случайных дефисов (-) (и что названия брендов и т. Д. Будут содержать только буквенно-цифровые символы и пробелы - чтобы разрешить другие символы, добавьте их в классы символов [] ), вы можете использовать следующее регулярное выражение:

^([\w\s]+?)\s*-\s*([\w\s]+)$

Объект результата будет выглядеть так:

$1 Фирменное наименование
$2 Наименование товара

1 голос
/ 27 января 2010

если ваши данные структурированы таким образом, самый простой способ - использовать любой метод разбиения, который есть в вашем языке, а затем выполнить разбиение на «-». например, в 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);
1 голос
/ 27 января 2010

Для этого вам не нужно регулярное выражение - достаточно простого 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";
}

?>

Рубиновая версия:

#!/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 голосов
/ 27 января 2010

Если вы знаете, что данные хорошо отформатированы и, в частности, строка - - один пробел, один дефис, один пробел - будет появляться только в качестве разделителя в середине, вы можете использовать (.*) - (.*) чтобы получить название бренда в первой группе и название продукта во второй.

0 голосов
/ 27 января 2010

Вам не нужно регулярное выражение для этой задачи. Просто найдите индекс подстроки "-". Материал перед именем группы, а после - название продукта.

...