【问题标题】:How to combine these two regex passes into one?如何将这两个正则表达式组合为一个?
【发布时间】:2013-09-21 19:02:49
【问题描述】:

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

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$/";

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

有什么提示吗?

【问题讨论】:

    标签: php regex preg-match-all pcre


    【解决方案1】:

    使用这种模式

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

    【讨论】:

    • 好的,成功了。 (不知道为什么以前没有。)我在编辑的表达式中有一个额外的正斜杠。我还使用了$matches[1][0] 和$matches[2][0] 来获取正确的字段。谢谢你告诉我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多