我有一个像s = "abc.def..ghi"
这样的字符串。我想替换单曲'。'有两个' s。但是,s.replace(".", "..")
会产生" abc..def .... ghi"。我怎样才能得到正确的行为?我要查找的输出是s = "abc..def..ghi"
。
答案 0 :(得分:6)
仅当点被两个字符包围时才更换点
String foo = s.replaceAll("(\\w)\\.(\\w)", "$1..$2");
或@Thilo评论,只有它被两个非点
包围String foo = s.replaceAll("([^.])\\.([^.])", "$1..$2");
即使点位于字符串的开头/结尾,也要用两个点替换单点,使用负向前瞻和后观:
(示例字符串:.abc.def..ghi.
将变为..abc..def..ghi..
)
String foo = s.replaceAll("(?<!\\.)\\.(?!\\.)", "..");
答案 1 :(得分:3)
如果您不知道如何使用正则表达式,请使用StringTokenizer
拆分字符串并再次与..
连接。
代码:
public static void main(String[] args) {
String s = "abc.def..ghi";
StringTokenizer s2 = new StringTokenizer(s, ".");
StringBuilder sb = new StringBuilder();
while(s2.hasMoreTokens())
{
sb.append(s2.nextToken().toString());
sb.append("..");
}
sb.replace(sb.length()-2, sb.length(), ""); // Just delete an extra .. at the end
System.out.println(sb.toString());
}
我知道代码与一行正则表达式相比很大但是如果你在使用正则表达式时有任何问题,我会发布它。如果你认为它比接受的答案慢,我用System.currentTimeMillis()
做了一个开始和结束时间,我得到了更快。我不知道该测试是否有任何例外。
无论如何,我希望它有所帮助。
答案 2 :(得分:2)
使用环顾四周:
str = str.replaceAll("(?<!\\.)\\.(?!\\.)", "..")(
正则表达式为&#34;一个点,前面没有点,后面没有点&#34;。这将处理点位于开头/结尾的边缘情况和/或字面上任何其他字符包围。
因为环顾四周不会消耗输入,所以你不必在替换术语中使用反向引用来玷污自己。
答案 3 :(得分:-6)
s.replace("...","..");
s.replace("....","..");
取决于输入的可能性..