2011-04-30 111 views
1

我试图做出我一直在问到工作正则表达式,但我有没有运气使它足够有效后返回数据。
目标是尽可能提高效率。
目的号码1.独立使用的句子结尾(点,3点,感叹号...)的所有文本。
目标数2获取所有的字符串“时间”
这里是一个可能的小弦,并为它的正则表达式的例子后出现的号码。 (真正的人可以真正hudge)
正则表达式: 老:
(?:[^.!?:]|...)(?:(?:[^.!?:]|...)*?em (\d+))*
新:
(?:[.!?]|[.][.][.])(?:(?:[^.!?]|[.][.][.])*?\bem\b (\d+))*
PHP的正则表达式。搜索词和词

作品为字符串(我只是做它)
(我插入。在开始)

.Foi visto que a batalha em 1939 foi。 Claro que a data que digo ser em 1939éuma farsa。 Em 1938já(插入em 1910)nãohavia reis。

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

添加(回答一个删除的问题):
不幸的是,我没有样本数据,谁让我这样做,他说,他还没有样本数据仍然需要做到“昨天”。如果你给我一些与本文一样有效的东西,我肯定我可以和它一起工作,如果需要的话,也可以转换成专门用于这项工作的东西。否则我会再次问这里。

回答

0

我不会回答有关性能,但:

  • 你不应该使用“...”,以配合......但是“......”(否则,你匹配的3个字符的任意序列)。请注意,这可能会大大提高你的表演。
  • 我不会说那种语言(西班牙语),但我想你想只匹配单词“EM”,而不是终止(例如balahem 1930将匹配)。
  • 你不应该假设你有“时间”和你的电话号码之间只有一个空格:Em__1950(由空格替换_)将不匹配

编辑: 关于PERF:(。)匹配任何东西在重复块内部强制引擎在一段时间内来回移动:如果您可以匹配明确的模式,它将始终快得多。

+0

关于:你不应该认为你在'em'和你的号码之间只有一个空格:Em 1950不匹配。没问题。我正在使用不区分大小写的标志。或者如果我使用课堂,速度会更快吗? – brunoais 2011-04-30 08:22:52

+0

这个模式很简单。找到一个单词em,后面有一个数字,然后获得该数字,否则忽略并转到下一个数字 – brunoais 2011-04-30 08:38:18

1

虽然问题是混乱的,这听起来像你有最好用两种不同的正则表达式acomplished两个不同的任务。这里是一个测试脚本,你想要做什么(我猜):

<?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."

+0

我将使用它,thx。 (我希望这就是他们想要的,他们所说的没有任何回答:)) – brunoais 2011-04-30 17:25:49