PHP的正则表达式。搜索单词并在单词后返回数据

时间:2011-04-30 08:02:16

标签: php regex boost-regex

我正在尝试为我所要求的作品制作一个正则表达式,但我没有运气使它足够有效。
目标是尽可能提高效率 目标编号1.使用句子结尾(点,3点,感叹号......)分隔所有文本 目标编号2获取字符串'em'之后出现的所有数字 这是一个可能的小字符串和正则表达式的示例。 (真正的一个可以真的轻推)
正则表达式: 老:
(?:[^.!?:]|...)(?:(?:[^.!?:]|...)*?em (\d+))*
新:
(?:[.!?]|[.][.][.])(?:(?:[^.!?]|[.][.][.])*?\bem\b (\d+))*

适用于字符串(我刚刚编写)
(我在开头插入。)

  

.Foi visto que a batalha em 1939 foi。 Claro que a dig que digo ser em1939éumafaarsa。 Em1938já(插入em 1910)nãhaviareis。

我想要的是制作一个没有回溯的正则表达式,因为它根本不需要回溯。通过制作它,我认为我可以节省处理,这需要...从30秒减少到20秒甚至10秒!仅为此1,完成需要1秒 地址:
现在,我有一个不会失败的答案。但它仍然会回溯太多。任何解决方案?

添加(回答一个已删除的问题):
不幸的是我没有样本数据,谁让我这样说他还没有样本数据仍然需要“到昨天”。如果你给我一些与本文合作的东西尽可能高效,我确信我可以使用它并且如果需要特定于这项工作的东西,我可以隐蔽。否则我会再次问这里。

2 个答案:

答案 0 :(得分:1)

虽然问题很混乱,但听起来你有两个不同的任务,最好用两个不同的正则表达式完成。这是一个经过测试的脚本,可以完成你想要的(我猜):

<?php // test.php 20110430_1100
    // Test data.
    $text = 'Foi visto que a batalha em 1939 foi. Claro'.
        ' que a data que digo ser em 1939 é uma farsa. E'.
        'm 1938 já (insert em 1910) não havia reis.';

    // Part 1: Find all numbers after "em".
    $re1 = '/\bem\b\s*(\d+)\b/i';
    $count = preg_match_all($re1, $text, $matches);
    if ($count) $numbers = $matches[1]; // Array of number strings.
    else        $numbers = array();     // Else no numbers found.

    // Part 2: Split text into sentences.
    $re2 = '/(?<=[.!?])\s+/';
    $sentences = preg_split($re2, $text, -1, PREG_SPLIT_NO_EMPTY);

    // Print out results.
    $ncnt = count($numbers); // Count of numbers found.
    printf("There were %d numbers following \"em\".\n", $ncnt);
    for ($i = 0; $i < $ncnt; ++$i) {
        printf("  Number[%d] = %s\n", $i + 1, $numbers[$i]);
    }
    $scnt = count($sentences); // Count of sentences found.
    printf("\nThere were %d sentences found.\n", $scnt);
    for ($i = 0; $i < $scnt; ++$i) {
        printf("  Sentence[%d] = \"%s\"\n", $i + 1, $sentences[$i]);
    }
?>

以下是脚本的输出。

There were 4 numbers following "em".
Number[1] = 1939
Number[2] = 1939
Number[3] = 1938
Number[4] = 1910

There were 3 sentences found.
Sentence[1] = "Foi visto que a batalha em 1939 foi."
Sentence[2] = "Claro que a data que digo ser em 1939 é uma farsa."
Sentence[3] = "Em 1938 já (insert em 1910) não havia reis."

答案 1 :(得分:0)

我不会回答有关表现但是:

  • 你不应该使用'...'来匹配...但是'...'(否则,你匹配3个字符的任何序列)。请注意,这可能会极大地改善您的性能。
  • 我不会说那种语言(西班牙语),但我认为你只想匹配“em”这个词,而不是终止(例如balahem 1930会匹配)。
  • 你不应该假设'em'和你的号码之间只有一个空格:Em__1950(用空格替换_)不匹配

修改: 关于perf:匹配重复块内的任何东西(。)会迫使引擎反复运行:如果你可以匹配显式模式,它总是会更快。