java中怎么替换string中的某个字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中怎么替换string中的某个字符相关的知识,希望对你有一定的参考价值。

/¥392931String这个对于程序原来说一定是最熟悉不过的,很多时候我们都习惯去使用String的原生方法去完成查找字符串、替换、删除,而正则表达式由于略显苦涩的语法常常被人忽略,其实很多时候使用正则表达式可以提高不少性能和节省资源。

一、正则表达式简述

正则表达式正则表达是Java中比较矛盾的知识点,因为使用起来可以很简单也可以相当地有难度,但是对于字符串操作来说应用得当则事半功倍,字符串查找,搜索,匹配,替换等等,正则表达式无所不能。而所谓正则表达式本质就是一个字符串(这个字符串按照一定的语法和规范被构造出来作为限定条件),其主要参与者——Pattern和Matcher:Pattern是Java正则表达式API中的主要入口,是程序语言中对这个特殊正则字符串的编译表示,需要使用正则表达式,第一步都是从构造Pattern 类开始,而Matcher是输入字符串进行解释和匹配操作的引擎,通过解释 Pattern 对 Character sequence 执行匹配操作(即Matcher负责完成字符串的查找、匹配、替换等操作。)

二、正则表达式基本语法

1、预留字符

限定符

说明

.    任意英文字母    

\\    反斜杠, 单独的反斜杠做为转义字符,与其他特殊字符一起使用。如果想匹配反斜杠本身,需要转义。两个反斜杠实际匹配一个反斜杠n字符的8进制表示.n 在0至7之间取值    

nn    字符的8进制表示.n 在0至7之间取值    

mnn    字符的8进制表示. m 在0至3之间取值, n 在0至7之间取值    

\\xhh    字符的16进制表示.    

\\uhhhh    字符的16进制表示 0xhhhh. 对应unicode 编码字符    

\\t    缩进符.    

\\n    换行符 (unicode: ‘\\u000A’)    

\\r    回车符 (unicode: ‘\\u000D’)    

\\f    制表符 (unicode: ‘\\u000C’)    

\\a    警报(铃声)字符 (unicode: ‘\\u0007′)    

\\e    转义符 (unicode: ‘\\u001B’)    

\\cx    控制符 x    

\\d    匹配任意数字 [0-9]    

\\D    匹配任意非数字 [^0-9]    

\\s    匹配任意空白符 (空格, 缩进, 换行,回车)    

\\S    匹配任意非空白符    

\\w    匹配任意单词    

\\W    匹配任意非单词    

2、设置指定限定条件[](即“[]”表示的是中括符里的内容是条件)

限定符

说明

[a-z]    匹配小写a to z范围中任一个字符,又如[abc] 匹配 a, 或 b 或 c    

[A-Z]    匹配大写A to Z范围中任一个字符    

[a-zA-Z]    匹配小写a to z或大写A to Z范围中一个字符    

[0-9]    匹配小写0 to 9范围中一个字符    

[0-9a-z]    匹配小写0 to 9或a to z范围中一个字符    

[0-9[a-z]]    匹配小写0 to 9或a to z范围中一个字符(交集)    

[^abc]    匹配不是a,b,c 的字符,是否定匹配    

[a-zA-Z]    匹配a 到 z ,A到Z 直接的字符,是范围匹配    

[a-d[m-p]]    匹配a到d之间字符或 m到p之间字符,是并集匹配    

[a-z&&[def]]    匹配 d, e, 或 f. 是交集匹配 (这里是在范围 a-z和字符def之间取交集).    

[a-z&&[^bc]]    匹配a-z 之间所有字符,排除bc的字符。是减法匹配    

[a-z&&[^m-p]]    匹配a-z 之间所有字符,排除m-p之间的字符是减法匹配    

3、边界匹配

边界符

说明

^    匹配行首    

$    匹配行尾    

\\b    匹配单词边界    

\\B    匹配非单词边界    

\\A    匹配文本开头    

\\G    匹配前一匹配项结尾    

\\Z    输入的结尾,仅用于最后的结束符(如果有的话)    

\\z    匹配文本结尾    

4、逻辑操作符和量词表示

正则表达式支持少量的逻辑运算(与,或)。与操作是默认的,表达式 cmo,意味着c 与 m与o。 
或操作需要显示指定,用 | 表示。例如表达式 crazy|mo意味着crazy或 mo。

贪婪模式

饥饿模式

独占模式

说明

X?    X??    X?+    匹配0或1次,即出现X 0或者1次    

X*    X**?    X*+    匹配0或多次    

X+    X+?    X++    匹配1或多次    

Xn    Xn?    Xn+    匹配n次    

Xn,    Xn,?    Xn,+    匹配最少n次    

Xn, m    Xn, m?    Xn, m+    匹配最少n次,最多m次    

三、正则表达式的应用

    编译正则表达式的字符串值构造对应的模式Pattern对象

    创建匹配给定输入与此模式的匹配器Matcher

    通过匹配器对象执行操作,匹配器对象的方法很丰富,互相组合使用更加强大(JDK在线API)

    1、去掉字符串中的空格和换行符

    public static String getNonBlankStr(String str)      


    if(str!=null && !"".equals(str))      


    Pattern pattern = Pattern.compile("\\\\s*|\\t|\\r|\\n"); //去掉空格符合换行符    


    Matcher matcher = pattern.matcher(str);      


    String result = matcher.replaceAll("");      


    return result;      


    else      


    return str;      


             


      12345678910


    2、去掉指定特殊字符

    public   static   String StringFilter(String   str)   throws PatternSyntaxException    // String   regEx  =  "[^a-zA-Z0-9]"; // 只允许字母和数字


    // 清除掉所有特殊字符(除了~之外)


    String regEx="[`!@#$%^&*()+=|':;',//[//].<>/?!@#¥%……&*()——+|【】‘;:”“’。,、?]";


    Pattern pattern   =   Pattern.compile(regEx);


    Matcher matcher   =   pattern.matcher(str);    return   matcher.replaceAll("").trim();


    123456789


    3、Pattern.matches()检查字符串中是否存在指定字符

    String text    = "there are many hotels " +"by amap.the adrr: http://xxxx pattern.";String pattern = ".*http://.*";


    boolean matches = Pattern.matches(pattern, text);//true则存在123


    4、Pattern.split()用正则表达式作为分隔符,把文本分割为String类型的数组

    /**


    * 结果:element =  grjk Text


    element =  wwwdsf


    element =  Many


    element =  egsdg r geg


    */String text = "A reg grjk Text reg wwwdsf reg Many reg egsdg r geg";


    String patternString = "reg";


    Pattern pattern = Pattern.compile(patternString);


    String[] split = pattern.split(text);for(String element : split)


    System.out.println("element = " + element);


    1234567891011121314


    5、Matcher 实例的find() + start() + end()寻找字符串中指定字符串出现的次数和起始和结束的索引位置

    /**


    *结果:found: 1 : 2 - 4


    found: 2 : 5 - 7


    found: 3 : 23 - 25


    found: 4 : 70 - 72


    */String text    ="This is the text which is to be searched " +"for occurrences of the word 'is'.";              


    String patternString = "is";                


    Pattern pattern = Pattern.compile(patternString);              


    Matcher matcher = pattern.matcher(text);int count = 0;while(matcher.find())            


    count++;                


    System.out.println("found: " + count + " : "  + matcher.start() + " - " + matcher.end());              


    12345678910111213141516


    6、Matcher 匹配指定格式的特殊字符串

    Pattern pattern = Pattern.compile("[0-9]*");//判断是否都是数字


    Matcher isNum = pattern.matcher("1123是数字");


    if(isNum.matches())


    System.out.println("全部是数字");


    else


    System.out.println("有汉字");



参考技术A

看看如下代码和运行结果

String s = "my.test.txt";
System.out.println(s.replace(".", "#"));
System.out.println(s.replaceAll(".", "#"));
System.out.println(s.replaceFirst(".", "#"));   
 
运行结果:
 my#test#txt
 ###########
 #y.test.txt

本回答被提问者采纳
参考技术B 建议你使用StringBuilder来构建字符串,然后可以使用strBuilder.setCharAt(1, '');来修改某一字符。如果要将字符串的所有特定字符全部替换,string中可以使用replaceAll("","");方法。
使用stringBuilder构建字符串有着更好的操作性~
参考技术C String str = "123";

str = str.replaceAll("2","");//把2替换为空字符转

替换字符串数组中的某个字符串

【中文标题】替换字符串数组中的某个字符串【英文标题】:Replace certain string in array of strings 【发布时间】:2012-02-18 18:55:56 【问题描述】:

假设我在 java 中有这个字符串数组

String[] test = "hahaha lol", "jeng jeng jeng", "stack overflow";

但现在我想将上面数组中的字符串中的所有空格替换为%20,让它变成这样

String[] test = "hahaha%20lol", "jeng%20jeng%20jeng", "stack%20overflow";

我该怎么做?

【问题讨论】:

请注意,您的问题及其标题存在分歧 - 您的问题非常具体,而标题非常笼统。我在下面的回答涉及问题,而不是标题。 String.replace() ...毫无疑问的例子;-) 【参考方案1】:

遍历数组并将每个条目替换为其编码版本。

像这样,假设您实际上只是在寻找与 URL 兼容的字符串:

for (int index =0; index < test.length; index++)
  test[index] = URLEncoder.encode(test[index], "UTF-8");

要符合当前的 Java,您必须指定编码 - 但是,它应该始终是 UTF-8

如果您想要更通用的版本,请按照其他人的建议:

for (int index =0; index < test.length; index++)
    test[index] = test[index].replace(" ", "%20");

【讨论】:

请注意,令人讨厌的是,URLEncoder.encode(str) 已被弃用,取而代之的是其将编码类型作为第二个参数(应始终为“UTF-8”)的重载形式。【参考方案2】:

这是一个简单的解决方案:

for (int i=0; i < test.length; i++) 
    test[i] = test[i].replaceAll(" ", "%20");

但是,您似乎正在尝试转义这些字符串以在 URL 中使用,在这种情况下,我建议您寻找一个可以为您执行此操作的库。

【讨论】:

看我的回答,它是 JDK 的一部分。 急于回答一个简单的问题并犯简单的错误:) 另外,请参阅我对 maerics 的回答 re: replace and replaceall 的评论。【参考方案3】:

尝试使用String#relaceAll(regex,replacement);未经测试,但这应该可以工作:

for (int i=0; i<test.length; i++) 
  test[i] = test[i].replaceAll(" ", "%20");

【讨论】:

请注意,String#replace(target, replacement) 应该可以解决问题。 replacereplaceAll 相同,但不适用于 RegExes。【参考方案4】:

对于每个字符串,你会做一个 replaceAll("\\s", "%20")

【讨论】:

【参考方案5】:
String[] test="hahaha lol","jeng jeng jeng","stack overflow";
                for (int i=0;i<test.length;i++) 
                    test[i]=test[i].replaceAll(" ", "%20");
                

【讨论】:

【参考方案6】:

直接来自 Java 文档...String java docs

你可以做 String.replace('toreplace','replacement')。

使用 for 循环遍历数组的每个成员。

【讨论】:

【参考方案7】:

您可以改用IntStream。代码可能如下所示:

String[] test = "hahaha lol", "jeng jeng jeng", "stack overflow";

IntStream.range(0, test.length).forEach(i ->
        // replace non-empty sequences
        // of whitespace characters
        test[i] = test[i].replaceAll("\\s+", "%20"));

System.out.println(Arrays.toString(test));
// [hahaha%20lol, jeng%20jeng%20jeng, stack%20overflow]

另见:How to replace a whole string with another in an array

【讨论】:

以上是关于java中怎么替换string中的某个字符的主要内容,如果未能解决你的问题,请参考以下文章

java怎么把一个字符串中的字符替换成别

java中怎么进行字符串替换?

java 替换文本中的所有指定的字符串,比如#*替换为sq, #**替换为we, 我使用了replaceAll进行的替换

java里怎么输入多行字符 且以指定的字符结束

java 字符串替换 怎么替换[]中间内容

java怎么删除字符串中的指定字符