String a = "This is a book! I am a boy. He is a good man. My friend Mrs. Roy is good man. He is nice person. Miss. Star is my friend.";
String b = Pattern.compile("([a-zA-Z]+)([.!?])( )([A-Z]+)",Pattern.CASE_INSENSITIVE).matcher(a).replaceAll("$1$2 →$4");
结果是:
这是一本书! →我是个男孩。 →他是个好人。 →我的朋友太太→罗伊是好人。 →他是个好人。 →小姐。明星是我的朋友。
但我想要的是:
这是一本书! →我是个男孩。 →他是个好人。 →我的朋友罗伊夫人是好人。 →他是个好人。 →小姐。明星是我的朋友。
我不想在“Mr。”,“Miss。”,“Mrs。”,“Ms。”之后添加“→”。 →标记句子的开头。
感谢〜!
答案 0 :(得分:1)
如果你希望在测试中匹配一个写得好的句子,你应该首先匹配大写或小写,然后匹配任何不是引用然后其中之一的句子。 然后不要匹配像博士,先生,夫人等特殊群体。
(([^.!?]|(?<=Dr|Mr|Mrs|\b[A-Za-z]|\s)[.!?])*[\.!?])
解释:
第一捕获小组
(([^.!?]|(?<=Dr|Mr|Mrs|\b[A-Za-z]|\s)[.!?])*[\.!?])
第二捕获小组
([^.!?]|(?<=Dr|Mr|Mrs|\b[A-Za-z]|\s)[.!?])*
*
量词 - 在零和无限次之间匹配,尽可能多次,根据需要回馈(贪婪) 重复捕获组仅捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置捕获组以捕获所有迭代或使用非捕获组 第一选择
[^.!?]
匹配列表中不存在的单个字符。!?
第二选择
(?<=Dr|Mr|Mrs|\b[A-Za-z]|\s)[.!?]
积极的外观
(?<=Dr|Mr|Mrs|\b[A-Za-z]|\s)
断言下面的正则表达式匹配
第一选择
Dr|Mr|Mrs
博士匹配角色Dr,Mr,Mrs(区分大小写)
第二种选择
\b[A-Za-z]\s
两个小组
[.!?]
匹配列表中的单个字符。!?