0

这可能是一个蹩脚的问题,但我是一个正则表达式的新手。我有一些格式的文本数据:

公司名称:公司名称、地点。
公司地址:一些,地址,这里。
链接: http: //www.somelink.com

现在,我想使用正则表达式将它们拆分为名称数组:值对。我正在尝试/(.*):(.*)/使用正则表达式preg_match_all(),它在前两行中运行良好,但在第三行中,它的一部分返回“链接:http:”,另一部分返回“//www.somelink.com”。

那么,有没有办法只在第一次出现字符':'时分割行?

4

2 回答 2

1

使用否定字符类(参见 rubular.com):

/^([^:]*):(.*)$/m

[…]一个字符类。like[aeiou]匹配任何一个小写元音。[^…]是一个否定字符类。[^aeiou]匹配除小写元音之外的任何一个。

模式开头和结尾处的 and 是行^锚点的开头和结尾。修饰符打开多行模式$m

原始模式的问题在于,.当您本可以更具体时,您正在(ab)使用,并且由于*贪婪,第一组被过度匹配。尝试通过使重复不情愿来“解决”这个问题很诱人,但最好更具体一点,并说第一组匹配除:.

但是请注意,这是一个匹配模式,带有捕获。它实际上不是仅匹配分隔符的拆分模式。分隔符模式真的只是:.

相关问题


PHP 片段

鉴于这种:

$text = <<<EOT
Company Name: Name of the company, place.
Company Address: Some, address, here.
Link: http://www.somelink.com
EOT;

preg_match_all('/^([^:]*):(.*)$/m', $text, $matches, PREG_SET_ORDER);

print_r($matches);

输出是(如在 ideone.com 上看到的):

Array
(
    [0] => Array
        (
            [0] => Company Name: Name of the company, place.
            [1] => Company Name
            [2] =>  Name of the company, place.
        )

    [1] => Array
        (
            [0] => Company Address: Some, address, here.
            [1] => Company Address
            [2] =>  Some, address, here.
        )

    [2] => Array
        (
            [0] => Link: http://www.somelink.com
            [1] => Link
            [2] =>  http://www.somelink.com
        )

)
于 2010-08-13T18:57:54.037 回答
0

您可能想要类似/(.*?):(.*)/. ?后面的将*使其“不贪婪”,因此它将以这种方式消耗尽可能少的文本。我认为这将适用于您的情况。默认情况下,*它是“贪婪的”,并尝试匹配尽可能多的重复。

编辑:有关使用and运算符匹配重复的更多信息,请参见此处*+

于 2010-08-13T18:52:06.533 回答