从结果中排除正则表达式断言?

时间:2014-08-06 10:06:01

标签: php regex regex-lookarounds

我正在尝试从大型数据库中的产品说明中提取部分文本(书籍参考)

示例:

books A 41.14 (products -> cat1 -> (1990-2000))

我只需要A 41.14

我在PHP中试过这个(后面跟着括号)

books(.*)(?=\s\(.*\))

但它没有按预期捕获,我需要排除断言,是否可能?

4 个答案:

答案 0 :(得分:1)

在你的正则表达式中使用\K来排除之前的匹配,并使用前瞻来检查以下内容应该是\s*(,即零个或多个空格后跟(符号

books\s*\K.*?(?=\s*\()

DEMO

PHP代码将是,

<?php
$mystring = "books A 41.14 (products -> cat1 -> (1990-2000))";
$regex = '~books\s*\K.*?(?=\s*\()~';
if (preg_match($regex, $mystring, $m)) {
    $yourmatch = $m[0]; 
    echo $yourmatch;
    }
?> //=> A 41.14

答案 1 :(得分:0)

如果您感兴趣的产品代码永远不能包含左括号字符,那么您可以简单地使用此模式:

books\s+([^(]+)\s+\(

如果开括号字符可以出现在产品代码中,那么您的任务就比较棘手。

答案 2 :(得分:0)

请试试这个:

preg_match( '/books\s?([\w]+\s?[\d|\.]+).*/i', "books A 41.14 (products -> cat1 -> (1990-2000))", $matches);
echo $matches[1];

希望它有所帮助,

最好的问候

答案 3 :(得分:0)

如果你在浮动之前总是有一个字母,你可以使用。

(\w (\d+)\.(\d+))