繁体   English   中英

替换字符串中的字符,Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM