使用正则表达式将缩写重新组合在一起

时间:2015-06-16 22:25:53

标签: java regex string

我有String str = "U. S. ";使用正则表达式,我该如何制作str = "U.S."? str只是一个大字符串的一部分,字符串的其余部分由句子组成,所以我想要一个仅适用于"一个字符"的正则表达式。句子和多个案例(即"A. K. A. ""B. C. ")。到目前为止,我已尝试使用replaceAll(),但我不知道如何引用构成刚刚捕获的匹配的字符,以便我可以在替换字符串中使用它们。

*通过"一个字符"句子我的意思是,在示例中"U. S.","S."

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您使正则表达式一次匹配一个缩写字符,则可以使用replaceAll()$1替换它:

String s1 = "Back in the U. S. S. R.";
String s2 = s1.replaceAll("([A-Z]\\.) (?=[A-Z]\\.)", "$1");
System.out.println(s2);

输出:

Back in the U.S.S.R.

正则表达式:

([A-Z]\.)匹配单个大写字母后跟一个点,作为捕获组1,可以使用$1引用。

(?=[A-Z]\.)一个空格,然后检查后面是否有另一个缩写字符。在匹配的字符之后检查另一个字符是必要的,因为您不想替换缩写中最后一个字符后面的空格。对于例如"John lives in the U. S. A. He is a student"应该变为"John lives in the U.S.A. He is a student",而不是"John lives in the U.S.A.He is a student"

如果您使用匹配可变长度缩写的正则表达式,则无法使用简单的replaceAll进行此操作,例如([A-Z]\. )+(?=[A-Z]\.)因为您无法在替换字符串中引用捕获组的单个重复。