我正在使用正则表达式(php / perl兼容)来获取某些文本中的第一句话。我意识到,如果覆盖每一个案例,这可能会变得很大,但只是在目前“足够好”之后。有人为此获得了现成的东西吗?
答案 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先生和他的句子匹配这么多,正如他所说的“这句话,不是很精彩吗?有人说,'这几乎就像是纯粹的例子。'”这部分不应该匹配但是。