第一句正则表达式

时间:2009-10-14 21:24:01

标签: php regex

我正在使用正则表达式(php / perl兼容)来获取某些文本中的第一句话。我意识到,如果覆盖每一个案例,这可能会变得很大,但只是在目前“足够好”之后。有人为此获得了现成的东西吗?

7 个答案:

答案 0 :(得分:5)

最终,你需要的是自然语言解析,这是非常难以做到的,并且对于正则表达式(甚至超级PCRE的表达式)来说可能是不可能的。考虑一下这句话:

  

Regex先生和他的句子匹配。

到目前为止给出的每一个答案都会将其解析为两个句子,而这甚至不是一个边缘案例 - 想象一段以“亲爱的亚当斯先生:”之类的文字或者类似的东西是非常合理的。您可以查看lookbehinds以检查标点符号前面的单词是什么,但是这将无法维护,因为您必须检查每个可能的缩写。你必须检查先生,例如和合作和圣和其他许多你永远不会想到的。一段时间后,你可能会得到一个“非常好”的实用解决方案,但它会变得丑陋,有一天会失败。

答案 1 :(得分:4)

嗯,/^[^.]+/是最简单的

答案 2 :(得分:3)

这不仅仅是一个正则表达式,但我写了一个Python函数来执行此操作:Separating sentences。自然语言处理是众所周知的困难,所以有些情况下这不对待,但它确实处理了一些棘手的案例。

答案 3 :(得分:1)

如果句子是“行”,则只需匹配一大块文本中的第一个^.*。默认情况下,DOT与新行字符不匹配。

如果它确实是第一句话,请执行以下操作:^[^.!?]*

答案 4 :(得分:0)

我知道你只想要一些现在有用的东西,但this mailing list post提出了/^[^\.]*\.\s/,而subsequent post提出了([\s\S]+?)\.( |\r|\n)

虽然这些模式似乎只与句点匹配,但如果您想要修改它以匹配其他类型的标点符号(如感叹号和问号),则取决于您。

答案 5 :(得分:0)

/\A(.+?)[.?!] /s

匹配所有内容,直到其中一个标点符号后跟空格。这句话是什么,不是吗? dot应匹配新行

答案 6 :(得分:0)

这适用于.NET:

/(?<=^\s*)(?!\s)("(\<'.*?'\>|.)*"|.)*?((?<='*"*)|[.?!]+|$)(?=\ \ |\n\n|$)/s

处理引号(美式)(并引用“喜欢这个”和“这是',是的,带标点符号。”)和以多个标点符号结尾的句子。也忽略前面的空格。但是,在句子之后需要两个空格或两个行尾或文件结尾。

处理以下内容:

  

对于Regex先生和他的句子匹配这么多,正如他所说的“这句话,不是很精彩吗?有人说,'这几乎就像是纯粹的例子。'”这部分不应该匹配但是。