Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP的正则表达式。搜索单词并在单词后返回数据_Php_Regex_Boost Regex - Fatal编程技术网

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

PHP的正则表达式。搜索单词并在单词后返回数据,php,regex,boost-regex,Php,Regex,Boost Regex,我正试图为我被要求完成的工作制作一个正则表达式,但我没有运气使它足够有效。 目标是使以下各项尽可能有效。 目标1。使用句子结尾(点、3点、感叹号…)分隔所有文本。 目标2:获取字符串“em”后出现的所有数字 下面是一个可能的小字符串和正则表达式的示例。(真正的可能是哈奇) 正则表达式: 旧的: (?:[^.!?:]|…)(?:(?:[^.!?:]|…)*?em(\d+))* 新增: (?:[.!?]|[.][.][.])(?:(?:[^.!?]|[.][.][.][.])*?\bem\b(\d+

我正试图为我被要求完成的工作制作一个正则表达式,但我没有运气使它足够有效。
目标是使以下各项尽可能有效。
目标1。使用句子结尾(点、3点、感叹号…)分隔所有文本。
目标2:获取字符串“em”后出现的所有数字
下面是一个可能的小字符串和正则表达式的示例。(真正的可能是哈奇)
正则表达式: 旧的:
(?:[^.!?:]|…)(?:(?:[^.!?:]|…)*?em(\d+))*

新增:
(?:[.!?]|[.][.][.])(?:(?:[^.!?]|[.][.][.][.])*?\bem\b(\d+))*

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

.Foi visto que a batalha em 1939 Foi。1939年,克拉罗·奎尔·奎尔·迪戈·塞尔姆·法尔萨的数据。Em 1938 já(插入Em 1910)não havia reis

我想要的是制作一个不需要回溯的正则表达式,因为它根本不需要回溯。通过这样做,我想我可以节省处理,这需要像。。。从30秒减少到20秒甚至10秒!仅此1,需要1s才能完成。
添加:
对于答案,现在我有一个不会失败的答案。但它仍然做了太多的回溯。有什么解决办法吗?

添加(回答一个已删除的问题):

不幸的是,我没有样本数据,要求我这样做的人说他也没有样本数据,这需要“到昨天”。如果你能给我一些尽可能有效地处理这篇文章的东西,我肯定我能处理它,如果需要的话,我可以把它隐藏起来。否则我会在这里再次询问。

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

  • 你不应该用“…”来匹配。。。但是“…”(否则,匹配3个字符的任意序列)。请注意,这可能会大大提高您的性能
  • 我不会说那种语言(西班牙语),但我认为您只希望匹配单词“em”,而不是终止语(例如,balahem 1930将匹配)
  • 您不应该假设“em”和您的号码之间只有一个空格:em_uuu1950(用空格替换)不匹配
编辑
关于性能:匹配重复块中的任何(.)都会迫使引擎来回运行一段时间:如果您可以匹配显式模式,那么它总是会更快

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

  • 你不应该用“…”来匹配。。。但是“…”(否则,匹配3个字符的任意序列)。请注意,这可能会大大提高您的性能
  • 我不会说那种语言(西班牙语),但我认为您只希望匹配单词“em”,而不是终止语(例如,balahem 1930将匹配)
  • 您不应该假设“em”和您的号码之间只有一个空格:em_uuu1950(用空格替换)不匹配
编辑
关于性能:匹配重复块中的任何(.)都会迫使引擎来回运行一段时间:如果您可以匹配显式模式,那么它总是会更快

尽管这个问题令人困惑,但听起来你有两个不同的任务,最好用两个不同的正则表达式来完成。下面是一个经过测试的脚本,它可以实现(我猜)您想要的功能:


下面是脚本的输出

在“em”之后有4个数字。

编号[1]=1939

编号[2]=1939

编号[3]=1938

Number[4]=1910

找到了3个句子。

句子[1]=“Foi visto que a batalha em 1939 Foi。”

句子[2]=“Claro que a data que digo ser em 1939├⌐ 乌玛·法尔萨。”


句子[3]=“Em 1938 j├í(插入em 1910)n├úo havia reis.“

尽管这个问题令人困惑,但听起来你有两个不同的任务,最好用两个不同的正则表达式来完成。下面是一个经过测试的脚本,它可以实现(我猜)您想要的功能:


下面是脚本的输出

在“em”之后有4个数字。

编号[1]=1939

编号[2]=1939

编号[3]=1938

Number[4]=1910

找到了3个句子。

句子[1]=“Foi visto que a batalha em 1939 Foi。”

句子[2]=“Claro que a data que digo ser em 1939├⌐ 乌玛·法尔萨。”


句子[3]=“Em 1938 j├í(插入em 1910)n├úo havia reis.“

关于:你不应该假设“em”和你的号码之间只有一个空格:em 1950不匹配。没问题。我正在使用不区分大小写的标志。或者如果我使用一个类会更快吗?模式很简单。找到一个后面有数字的单词em,然后获取该数字,否则忽略并转到下一个单词about:你不应该假设“em”和你的数字之间只有一个空格:em 1950不匹配。没问题。我正在使用不区分大小写的标志。或者如果我使用一个类会更快吗?模式很简单。找到一个后面有数字的单词em,然后获取该数字,否则忽略并转到下一个,我将使用它,thx。(舒尔希望这正是他们想要的,他们所说的一切都不反对这个答案:))我会用这个,thx。(舒尔希望这正是他们想要的,他们所说的一切都不违背这个答案:)