Regex help: захватить всю строку, если она начинается с 1. или 2. - PullRequest
1 голос
/ 02 декабря 2009

Я ужасно отношусь к регулярным выражениям, но хотел бы получить помощь в определении правила, которое будет принимать этот текст:

  1. Il Cuccio, via Ronchi 43 / b, 14047 Mombercelli, Asti.
    Тел .: 380 7277050 Факс: 0141 959282 E-mail: info@ilcuccio.it www.ilcuccio.it
    Размещение в коммунальной комнате или палатке. Французский и английский говорят. Контактное лицо: Кристина Белотти.

  2. Apicoltura Leida Barbara, Страда Кревенцоло 21, Вигуццоло, 15058 Алессандрия.
    Тел: 0131 899166 и 392 9078020 E-mail: barbaraleida@tiscali.it Ферма, расположенная на равнинах, сертифицирована как органическая (CCPB).

и вернуть адреса, то есть оставшуюся часть строки после [1-9].

Дополнительные баллы за связное объяснение, которое действительно помогло бы мне выучить немного.

РЕДАКТИРОВАТЬ : Я покажу свою работу, пока кто-нибудь еще не войдет. Прямо сейчас у меня есть ^\d+\., который является стартовой линией, цифрами, точкой.

Ответы [ 7 ]

1 голос
/ 02 декабря 2009

Вы хотите что-то вроде:

/ ^ [1-9] + \. (. *) $ /

^ означает начало в начале строки.

[1-9] означает любое число 1-9, но я думаю, что вы знали это.

+ означает, что мы хотим, чтобы было сопоставлено несколько предыдущих элементов. то есть цифры 1-9.

\. значит буквально найти.

(. *) Должен взять все, что осталось в строке, и вставить переменную для использования.

$ означает, что выражение должно идти до конца строки.

В Perl вы должны вытащить адрес из $ 1.

1 голос
/ 02 декабря 2009

в рубине

mystring="1. Il Cuccio, via Ronchi 43/b, 14047 Mombercelli, Asti.  \nTel: 380 7277050  Fax: 0141 959282  E-mail: info@ilcuccio.it  www.ilcuccio.it  \nAccommodation in communal room or tent. French and English \nspoken. Contact: Cristina Belotti. \n\n2. Apicoltura Leida Barbara, Strada Crevenzolo 21, Viguzzolo, 15058 Alessandria.  \nTel: 0131 899166 & 392 9078020  E-mail: barbaraleida@tiscali.it \nThe farm, situated in the plains, is certified organic (CCPB).\n\n"

# scan returns a list like [['addr1'], ['addr2'], ['addr3'], ...]
puts mystring.scan(/^\d+\. (.+)$/)

выход:

Il Cuccio, via Ronchi 43/b, 14047 Mombercelli, Asti.  
Apicoltura Leida Barbara, Strada Crevenzolo 21, Viguzzolo, 15058 Alessandria.  
1 голос
/ 02 декабря 2009
#!/usr/bin/perl
use strict; use warnings;

my $str = <<'EO_STR';
2. Il Cuccio, via Ronchi 43/b, 14047 Mombercelli, Asti.
Tel: 380 7277050  Fax: 0141 959282  E-mail: info@ilcuccio.it  www.ilcuccio.it
Accommodation in communal room or tent. French and English
spoken. Contact: Cristina Belotti.

3. Apicoltura Leida Barbara, Strada Crevenzolo 21, Viguzzolo, 15058 Alessandria.
Tel: 0131 899166 & 392 9078020  E-mail: barbaraleida@tiscali.it
The farm, situated in the plains, is certified organic (CCPB).
EO_STR

while ( $str =~ /^[0-9]\. ([^.]+)\./mg ) {
    print "$1\n";
}

Как я понимаю, . не появляется в адресной части. Таким образом, адрес является частью между [0-9]\. и последующим периодом. Таким образом, приведенное выше выражение захватывает все не . символы между [0-9]\. и \.. Используется модификатор m, поэтому ^ соответствует началу каждой строки, а не началу строки. Он использует модификатор g, чтобы пройти каждое совпадение в ответ.

Если вы просто хотите захватить все снимки:

my @addresses = $str =~ /^[0-9]\. ([^.]+)\./mg;

print $_, "\n" for @addresses;
0 голосов
/ 02 декабря 2009

У вас действительно есть две проблемы: найти строки, начинающиеся с цифр, и извлечь часть адреса. Это небольшое выражение должно найти строки:

^[[:space:]]*[[:digit:]]*\.[[:space:]]

Символ шляпы ("^") соответствует началу строки. Это выражение находит строки, начинающиеся с цифр и точки. Он игнорирует все пробелы в начале.

Вторая проблема - извлечение адреса - зависит от инструмента. Например, этот скрипт Perl печатает только адресные строки:

# perl -ne 'if (m/^\s*\d+\.\s*/) { s/^\s*\d+\.\s*//; print}' test.txt 

Il Cuccio, via Ronchi 43/b, 14047 Mombercelli, Asti.
Apicoltura Leida Barbara, Strada Crevenzolo 21, Viguzzolo, 15058 Alessandria.

"\ s" и "\ d" являются сокращенным обозначением Perl для сопоставления пробелов (\ s) и цифр (\ d). То же регулярное выражение. Он аккуратно помещается на одной линии.

Я использовал выражение дважды. Первый раз находит строки для печати. И вторая - команда «замена». Он заменяет первое выражение вторым. В этом случае второй содержит пробел - по существу стирая цифры.

0 голосов
/ 02 декабря 2009

какой язык вы используете ?? Нет необходимости в регулярных выражениях. Вот пример на Python

myaddr="""2. Il Cuccio, via Ronchi 43/b, 14047 Mombercelli, Asti.
Tel: 380 7277050  Fax: 0141 959282  E-mail: info@ilcuccio.it  www.ilcuccio.it
Accommodation in communal room or tent. French and English
spoken. Contact: Cristina Belotti.
"""

print myaddr.split("\n",1)[0].split(" ",1)[-1]

Там написано, разбить строку на новые строки (так как в ваших образцах строк есть новые строки, верно?). Затем получите первый элемент разделенной строки. Это будет ваша адресная часть. Разделите его снова, используя пробелы в качестве разделителей, и удалите первый элемент, который является цифрой. Остальное будет вашим адресом. Нет необходимости в регулярных выражениях. простой алгоритм, который вы можете реализовать на своем любимом языке

Версия PHP:

$str = <<<EOF
2. Il Cuccio, via Ronchi 43/b, 14047 Mombercelli, Asti.
    Tel: 380 7277050  Fax: 0141 959282  E-mail: info@ilcuccio.it  www.ilcuccio.it
    Accommodation in communal room or tent. French and English
    spoken. Contact: Cristina Belotti.
EOF;

$s = explode("\n",$str,2);
$addr = explode(" ",$s[0]);
array_shift($addr);
print "Address is: " . implode($addr," ");
0 голосов
/ 02 декабря 2009

/^\d+.\s+(.+)$/

  • Утверждение позиции в начале строки «^»
  • Соответствует одной цифре 0..9 «\ d +»
    • От одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «+»
  • Соответствует символу "." буквально «.»
  • Соответствует одному символу, который является «пробелом» (пробелы, табуляции, разрывы строк и т. Д.) «\ S +»
    • От одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «+»
  • Сопоставьте приведенное ниже регулярное выражение и запишите его совпадение в обратную ссылку 1 «(. +)»
    • Соответствует любому отдельному символу, который не является символом разрыва строки «. +»
      • От одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости (жадный) «+»
  • Утверждение позиции в конце строки (или до разрыва строки в конце строки, если есть) «$»

Я использую RegexBuddy для всех моих регулярных выражений. Он имеет отличную справку и простой интерфейс тестирования, чтобы проверить, как ваше регулярное выражение будет работать с некоторым примером текста.

0 голосов
/ 02 декабря 2009
^\d+\. (.*?)

Значение:

^       At line start
\d+     take one or more digits
\.      followed by a period character and a space
(.*?)   match (and remember) all characters until line end

Вы можете проверить свои регулярные выражения онлайн на RegExr: Бесплатный онлайн инструмент тестирования RegEx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...