[英]Replacing characters in a string, Java
我有一个像s = "abc.def..ghi"
的字符串。 我想取代单曲。 有两个“。”。 但是, s.replace(".", "..")
产生“ abc..def .... ghi”。 如何获得正确的行为? 我正在寻找的输出是s = "abc..def..ghi"
。
仅当点被两个字符包围时才替换
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("(?<!\\.)\\.(?!\\.)", "..");
如果您不知道如何使用正则表达式,则使用StringTokenizer
拆分String并再次与..
串联。
码:
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()
进行了开始和结束时间,并且得到的速度更快。 我不知道该测试是否有任何例外。
无论如何,我希望它会有所帮助。
使用环顾四周:
str = str.replaceAll("(?<!\\.)\\.(?!\\.)", "..")(
正则表达式的读法是“一个点,前面没有点,后面没有点”。 这将处理点的开始/结束和/或实际上由任何其他字符包围的点的边缘情况。
由于环顾四周不会消耗任何输入,因此您不必在替换术语中用向后引用来嘲笑自己。
s.replace("...","..");
s.replace("....","..");
取决于输入的可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.