正则表达式替换字符串和特定字符串

时间:2017-05-17 17:46:15

标签: java regex

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。”之后添加“→”。 →标记句子的开头。

感谢〜!

1 个答案:

答案 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

两个小组

[.!?]

匹配列表中的单个字符。!?

Regex Link