正则表达式帮助:如果以1或2开头,则捕获整行。

时间:2009-12-02 01:13:14

标签: regex language-agnostic

我对正则表达式很糟糕,但是会喜欢一些帮助来定义一个可以接受这个文本的规则:

  1. Il Cuccio,来自Ronchi 43 / b,14047 Mombercelli,Asti 电话:380 7277050传真:0141 959282电子邮箱:info@ilcuccio.it www.ilcuccio.it
    在公共休息室或帐篷住宿。法语和英语 说。联系人:Cristina Belotti。

  2. Apicoltura Leida Barbara,Strada Crevenzolo 21,Viguzzolo,15058亚历山德里亚。
    电话:0131 899166& 392 9078020电子邮件:barbaraleida@tiscali.it 该农场位于平原,是有机认证(CCPB)。

  3. 并返回地址,即超过[1-9]的其余行。

    一个连贯的解释的额外点,实际上可以帮助我学习一点点。

    编辑:我将继续展示我的工作,直到其他人介入。现在我的^\d+\.是一个起点,数字,句号。

7 个答案:

答案 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

您可以在RegExr: Free Online RegEx Testing Tool

在线测试正则表达式

答案 4 :(得分:0)

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

  • 在字符串«^»
  • 的开头处断言位置
  • 匹配单个数字0..9«\ d +»
    • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)«+»
  • 匹配字符“。”字面意思«。»
  • 匹配单个字符“空白字符”(空格,制表符,换行符等)«\ s +»
    • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)«+»
  • 匹配下面的正则表达式并将其匹配捕获到反向引用号1«(。+)»
    • 匹配任何不是换行符的单个字符«。+»
      • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)«+»
  • 断言字符串末尾的位置(或在字符串末尾的换行符之前,如果有的话)«$»

我使用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)

你正在使用什么语言?没有正则表达式。这是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," ");