我正在尝试为我所要求的作品制作一个正则表达式,但我没有运气使它足够有效。
目标是尽可能提高效率
目标编号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秒
地址:
现在,我有一个不会失败的答案。但它仍然会回溯太多。任何解决方案?
添加(回答一个已删除的问题):
不幸的是我没有样本数据,谁让我这样说他还没有样本数据仍然需要“到昨天”。如果你给我一些与本文合作的东西尽可能高效,我确信我可以使用它并且如果需要特定于这项工作的东西,我可以隐蔽。否则我会再次问这里。
答案 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)
我不会回答有关表现但是:
修改强>: 关于perf:匹配重复块内的任何东西(。)会迫使引擎反复运行:如果你可以匹配显式模式,它总是会更快。