如何将这两个正则表达式组合成一个?

时间:2013-09-21 19:02:49

标签: php regex preg-match-all pcre

我有几千个具有以下两种形式之一的字符串:

SomeT1tle-ThatL00ks L1k3.this - $3.57 KnownWord

SomeT1tle-ThatL00ks L1k3.that - 4.5% KnownWord

SomeT1tle-ThatL00ks L1ke.this部分可能包含大写和小写字符,数字,句点,短划线和空格。它后面总是有一个空间破折号空间模式。

我想拉出标题(空格 - 空格分隔符之前的部分)和金额,它就在KnownWord之前。

所以我想要这两个字符串:

SomeT1tle-ThatL00ks L1k3.this, $3.57

SomeT1tle-ThatL00ks L1k3.that, 4.5%

此代码有效(使用Perl等效正则表达式)

$my_string = "SomeT1tle-ThatL00ks L1k3.this - $3.57 KnownWord";

$pattern_title = "/^(.*?)\x20\x2d\x20/";
$pattern_amount = "/([0-9.$%]+) KnownWord$/";

preg_match_all($pattern_title, $my_string, $matches_title);
preg_match_all($pattern_amount, $my_string, $matches_amount);

echo $matches_title[1][0] . "  " . $matches_amount[1][0] . "<br>";

我尝试将两种模式放在一起:

$pattern_together_doesnt_work = "/^(.*?)\x20\x2d\x20([0-9.$%]+) KnownWord$/";

但是模式的第一部分总是匹配整个事物,即使是“懒惰”部分(.*?而不是.*)。我不能对空格和破折号进行否定匹配,因为标题本身可以包含。

任何提示?

1 个答案:

答案 0 :(得分:1)

使用此模式

/^(.*?)\x20\x2d\x20([0-9.$%]+) KnownWord$/