我对正则表达式很糟糕,但是会喜欢一些帮助来定义一个可以接受这个文本的规则:
Il Cuccio,来自Ronchi 43 / b,14047 Mombercelli,Asti
电话:380 7277050传真:0141 959282电子邮箱:info@ilcuccio.it www.ilcuccio.it
在公共休息室或帐篷住宿。法语和英语
说。联系人:Cristina Belotti。
Apicoltura Leida Barbara,Strada Crevenzolo 21,Viguzzolo,15058亚历山德里亚。
电话:0131 899166& 392 9078020电子邮件:barbaraleida@tiscali.it
该农场位于平原,是有机认证(CCPB)。
并返回地址,即超过[1-9]的其余行。
一个连贯的解释的额外点,实际上可以帮助我学习一点点。
编辑:我将继续展示我的工作,直到其他人介入。现在我的^\d+\.
是一个起点,数字,句号。
答案 0 :(得分:1)
#!/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;
答案 1 :(得分:1)
你想要这样的东西:
/ ^ [1-9] + \。 (。*)$ /
^表示从行的开头开始。
[1-9]表示任何数字1-9,但我认为你知道那个。
+表示我们希望匹配以前的多个项目。即数字1-9。
\。字面意思是找到一个。
(。*)应该抓住该行中的任何内容并粘贴在一个变量中供您使用。
$表示表达式应该到行尾。
在perl中你应该可以从$ 1中提取地址。
答案 2 :(得分:1)
in ruby
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.
答案 3 :(得分:0)
^\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在线测试正则表达式
答案 4 :(得分:0)
/^\d+.\s+(.+)$/
我使用RegexBuddy进行所有的复兴。它有很好的帮助和简单的测试界面,可以检查你的正则表达式如何处理一些示例文本。
答案 5 :(得分:0)
你真的有两个问题:找到以数字开头的行,并提取地址部分。这个小表达式应该找到以下几行:
^[[:space:]]*[[:digit:]]*\.[[:space:]]
hat(“^”)字符与行的开头匹配。此表达式查找以数字和句点开头的行。它在开头忽略了任何空白区域。
第二个问题 - 提取地址 - 取决于工具。例如,此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”是匹配空格(\ s)和数字(\ d)的Perl简写。相同的正则表达式它恰好适合一条线。
我使用了两次表达式。第一次找到要打印的行。第二个是“替代”命令。它用第二个表达式替换第一个表达式。在这种情况下,第二个包含空白 - 基本上删除数字。
答案 6 :(得分:-1)
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," ");