示例中的所有首字母缩写词都是模式Uppercase .
or Uppercase lowercase .
; 没有其他(常规)出现的句号与此特定模式匹配。
因此,可以使用一个简单的 RegEx 来删除句号。之后剩下的可以在常规标点符号上拆分.!?
。在 Javascript 中:
str2 = str.replace(/([A-Z][a-z]?)\./g, '$1');
或使用能够理解最常见字符类的 GREP 风格:
str2 = str.replace(/(\u\l?)\./g, '$1');
这会直接产生如图所示的输出。
使用 RegEx 很简单(并且很容易扩展!),但同样的模式也可以在其他语言中进行测试。在 C 中,您可以将输入复制到输出并仅在看到.
字符时进行测试:
int main (void)
{
char input[] = "Ms. Mary got to know her husband Mr. Dave in her trip to "
"U.S.A. and it was cool. Did you know Dave worked for Microsoft? Well "
"he did. He was even part of Internet Explorer devs.";
char output[256], *readptr, *writeptr;
printf ("in: %s\n", input);
readptr = input;
writeptr = output;
while (*readptr)
{
if (*readptr == '.')
{
if ((readptr > input && isupper(readptr[-1])) ||
(readptr > input+1 && isupper(readptr[-2]) && islower(readptr[-1])))
{
readptr++;
continue;
}
}
*writeptr = *readptr;
readptr++;
writeptr++;
}
*writeptr = 0;
printf ("out: %s\n", output);
return 0;
}
这些解决方案从源文本中删除句号。如果要保留它们,可以将它们替换为占位符(例如,源文本中通常不会出现的字符),或者做相反的事情:在拆分句子时,测试看是否是句号是一个有效的断点。
事后思考:它确实适用于原始例句......但它不适用于评论中的那个:
I made a trip to the U.S.A. It was cool.I liked it very much.
你在哪里得到输出
I made a trip to the USA It was cool.I liked it very much.
这需要检查更多可能的情况:
- 常见的缩写,例如
Ms.
and Mr.
:\u\l\.
- 句子首字母缩略词;"USA" 后跟一个小写:
(\u\.)+ (?=\l)
,句号需要删除;
- 句末首字母缩略词;"USA" 后跟一个大写字母:
(\u\.)+ (?=\u)
,应保留最后一个句号。