Regex 除了句号是缩写的一部分外,如何将段落拆分为句号(.)分隔的句子?

Regex 除了句号是缩写的一部分外,如何将段落拆分为句号(.)分隔的句子?,regex,string,parsing,Regex,String,Parsing,考虑这一段 保护组织称这项长达20年的禁令是对美国偶像的重要保护。采矿业和一些共和党国会议员说,这对亚利桑那州的经济和国家的能源独立是有害的。“尽管采矿业施加了巨大的压力,总统兼国务卿萨拉扎尔并没有退缩,”皮尤环境集团美国公共土地主管简·达诺维茨说 在上面的例子中,它很容易在句号(.)上拆分句子,但在美国处理句号时会导致错误的结果。假设我有一个缩写列表,例如 String abbrev[] ={"u.s.a", "u.a.e", "u.k", "p.r.c","u.s.s.r", }; Stri

考虑这一段

保护组织称这项长达20年的禁令是对美国偶像的重要保护。采矿业和一些共和党国会议员说,这对亚利桑那州的经济和国家的能源独立是有害的。“尽管采矿业施加了巨大的压力,总统兼国务卿萨拉扎尔并没有退缩,”皮尤环境集团美国公共土地主管简·达诺维茨说

在上面的例子中,它很容易在句号(.)上拆分句子,但在美国处理句号时会导致错误的结果。假设我有一个缩写列表,例如

String abbrev[] ={"u.s.a", "u.a.e", "u.k", "p.r.c","u.s.s.r", };
String regex= "\\.";
Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(sx);
int beginIndex=0;

// Check all occurance
int index=0;
while (matcher.find()) {
    System.out.print("Start index: " + matcher.start());
    System.out.print(" End index: " + matcher.end() + " ");

    String group=matcher.group();
    System.out.println("group: " + group);
    int dotIndex= group.indexOf(".");
    String sub= sx.substring(beginIndex, matcher.start()+dotIndex);
    beginIndex= matcher.start()+dotIndex;

    System.out.println(sub);
}            

我可以用dotIndex周围的所有缩写进行强力匹配。有更好的方法吗?

我最好的猜测是:
(?这将转换为:

(?<!\.[a-zA-Z])    # can't be preceded by a period followed by a single letter
\.
(?![a-zA-Z]\.)     # nor can it be followed by a letter and another preiod

(?依靠正则表达式无法解决这个问题。要知道一个句子是否在任何给定的句点结束并不简单。缩写可能是句子的结尾,也可能不是。省略号可以写成三个句点(或者,在某些情况下,四个句点,取决于流行的文体).句子有时会在句号后加上结束引号,结束引号位于句号后(同样取决于当时的风格)


你可以在大多数情况下使用启发式来获得正确的答案。但这更像是一个统计问题,而不是正则表达式问题。

你能利用一个规则句子后面的空间吗,或者有其他边界条件吗?@JoshG:我想过,但是其他情况呢,例如,这个例子就是
的例子,例如D一个空间。你需要根据前面的内容来验证(或否定),比如<代码>(需要一个句号和一个没有一个句号和一个字母的空间)。你打算如何区分句子中间的一个缩写与句子末尾的一个缩写?例如,“我住在美国”。缩写与@insipid的对比如何:您可以改变量词以接受
{1,2}
(基于一个句子通常不会以两个字母的单词结尾),或者在每个实例之前捕获单词,并根据例外列表对其进行测试(包括类似
vs
的缩写)在继续分析文本之前。@Brad:那么in.(如英寸)呢?可以是任意一个。将其添加到白名单是不够的。@CHao:分析文本是一个全职工作。你几乎总是可以做80%的事情,这使得99/100%的规则变得很难。