我有一些这样的文字:
在法国外交使团工作了一辈子后,格鲁斯伯爵和他的妻子住在伏尔泰码头一栋优雅的联排别墅里。他是一个讨人喜欢的人,当然很有教养,他以慷慨的主人和有趣的讲故事者而闻名。
我想使用正则表达式查找所有正确大小写。我排除的是点后的正确大小写,例如
. He
我在网上搜索了一下,发现这个输入可以
[a-z] [A-Z][\w]*
问题是您不能标记所有 2 个或 3 个单词,例如 Quai Voltaire,以及我如何排除一些适当情况,例如 I、Me、My...?
我怎样才能做到这一点?
答案1
我同意 Andreas 的观点。现在,如果这是一项一次性任务,您可以将其分解为多个步骤,我建议先暂时排除例外情况,可能使用其他未使用的字符,然后再将其放回原处。以下是查找和替换:
\b(I|God|Dad)\b
@\1
这给了我们类似这样的结果(请注意,在英语中 me 和 my 不大写):
Did @I write this to @God, @Dad, or my wife? After a lifetime in the
French diplomatic corps, the Count de Gruse lived with his wife
in an elegant townhouse on Quai Voltaire! He was a likeable man,
cultivated of course, with a well-deserved reputation as a
generous host and an amusing raconteur.
从那里,您可以使用区分大小写使用正则表达式和负向后视来查找前面有一个或多个空格且不遵循句子边界的大写单词:
(?<![.?'!"])[ ]+[A-Z]
请注意,这对于硬换行文本(例如上面示例中的“法语”)将会失败。
正则表达式可能相当脆弱,所以如果它不是一次性任务,那么像这样的事情可能需要一个小程序/脚本。(或者可能是宏。)
话虽如此,这就是您所要求的,也结合了负面前瞻,以便一步完成所有操作。:)
(?<![.?'!"]) (?!Dad\b|God\b|I\b)[A-Z]
提示:如果您没有或者不喜欢使用区分大小写的复选框,您可以将其放在正则表达式的前面:
(?c)
答案2
正则表达式和复杂异常不能很好地融合。 perl说到自然语言处理。
答案3
当我添加
[\w]*
那么我的正则表达式是
(?<![.?'!"]) (?!Dad\b|God\b|I\b)[A-Z][\w]*
它运行完美