`
京华倦客
  • 浏览: 124023 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String.replaceAll与String.replace的区别(转载)

阅读更多
主要就是后者是基于正则表达式的替换,而前者是一般的基于字符或字符序列本身的替换。
比如,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号,replace就做不到,因为它不是基于规则表达多的替换。

  首先看小例子


class t1 {  
           public static void main(String a[]) {  
             String s = 'E:\jbx\x9\io9';  
             String ss;  
    //把路径s中的'\'换为'\\',为何还要整8个'\'?我以为4个就行了。  
             ss = s.replaceAll('\\\\', '\\\\\\\\')  
             System.out.println('s= ' + s);  
             System.out.println('ss=' + ss);  
    //output:    
    //s= E:\jbx\x9\io9  
    //ss=E:\\jbx\\x9\\io9  
           }  
    } 
这里的关键是String.replaceAll()是用regular expression(也就是正则表达式) 来作为参数的,比如,可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号; 。但是java本身的字符串对于转义符\也有类似的处理。首先,java会把“\\\\”解释成一个字符串(其中包含两个char)——“\ \”这个就是你在JDK的文档里看到的。
接下来,由于replaceAll是以正则表达式作为参数,所以“\\”被解释成一个regex。对于一个regex来说这就代表着一个字符,就是“\”。对后面的那个8个\来说,最终会被解释成“\\”。

在replaceAll(String,String)方法中需要特殊处理英文状态的括号,在网上找了一下,可以使用下面的写法将英文括号替换成其他字符(比如中文全角括号):str1.replaceAll("\\(","(");



String replaceAll(String regex, String replacement)中的两个参数都是regex。尤其是当第二个参数replacement是用户输入或指定的字符串时,如果其中包含regex特殊字符(主要是\和$)而不加注意,就容易导致问题引发异常。这种情况下如果只是简单的字符串替换而无需regex引擎参与的话,就不要用 replaceAll好了。

将\ 转化为\\
java的replaceAll函数,使用的是正则表达式作为转换依据,而"\"在正则表达式中也是特殊字符,最后,写成下面的代码才达到了我预想的目的:
targetPath = targetPath.replaceAll("\\\\", "\\\\\\\\");

具体实例如下:

    String src = new String("ab43a2c43d");
        System.out.println(src.replace("3","f"));=>ab4f2c4fd.
        System.out.println(src.replace('3','f'));=>ab4f2c4fd.
        System.out.println(src.replaceAll("\\d","f"));=>abffafcffd.
        System.out.println(src.replaceAll("a","f"));=>fb43fc23d.
        System.out.println(src.replaceFirst("\\d,"f"));=>abf32c43d
        System.out.println(src.replaceFirst("4","h"));=>abh32c43d.


如何将字符串中的"\"替换成"\\":

        String msgIn;
        String msgOut;
        msgOut=msgIn.replaceAll("\\\\","\\\\\\\\");
原因:
         '\'在java中是一个转义字符,所以需要用两个代表一个。例如System.out.println( "\\" ) ;只打印出一个"\"。但是'\'也是正则表达式中的转义字符(replaceAll 的参数就是正则表达式),需要用两个代表一个。所以:\\\\被java转换成\\,\\又被正则表达式转换成\。
同样
        CODE: \\\\\\\\
        Java: \\\\
        Regex: \\


将字符串中的'/'替换成'\'的几种方式:

msgOut= msgIn.replaceAll("/", "\\\\");
         msgOut= msgIn.replace("/", "\\");
         msgOut= msgIn.replace('/', '\\');



2.lucene的Optimize优化

在以前的例子里,你可能已经多次见过writer.Optimize()这段代码.Optimize到底做了什么?

让你吃惊的是这里的优化对于建立索引不仅没有起到加速的作用,反而是延长了建立索引的时间.为什么?

因为这里的优化不是为建立索引做的,而是为搜索做的.之前我们提到Lucene默认每遇到10个Segment就合并一次,尽管如此在索引完成后仍然会留下几个segmnets,比如6,7.

而Optimize的过程就是要减少剩下的Segment的数量,尽量让它们处于一个文件中.

它的过程很简单,就是新建一个空的Segmnet,然后把原来的几个segmnet全合并到这一个segmnet中,在此过程中,你的硬盘空间会变大,因为同时存在两份一样大小的索引.不过在优化完成后,Lucene会自动将原来的多份Segments删除,只保留最后生成的一份包含原来所有索引的segment.

尽量减少segments的个数主要是为了增加查询的效率.假设你有一个Server,同时有很多的Client建立了各自不同的索引,如果此时搜索,那么必然要同时打开很多的索引文件,这样显然会受到很大的限制,对性能产生影响.

当然也不是随时做Optimize就好,如前所述做优化时要花费更多的时间和空间,而且在做优化的时候是不能进行查询的.所以索引建立的后期,并且索引的内容不会再发生太多的变化的时候做优化是一个比较好的时段.
ps:删除产品等操作结束后,如果不关闭IndexReader或者IndexWriter ,会导致操作未完成。

分享到:
评论

相关推荐

    String.prototype.replaceAll:适用于String.prototype.replaceAll ESnext提案的符合规范的polyfill

    string.prototype.replaceall 用于String.prototype.replaceAll的ES Proposal规范填充程序。 如果不可用或不String.prototype....// replaceAll and replace are the same, when given a global regex to replace as

    JS中实现replaceAll的方法(实例代码)

    文章接着介绍了如何自定义一个replaceAll函数,这个函数利用了String对象的原型,通过扩展String原型来添加replaceAll方法,使其成为String对象可以调用的新方法。这个自定义的replaceAll方法不仅考虑了正则表达式和...

    字符串string.zip

    4. **字符串操作**:字符串可以进行连接(`+`运算符或`StringBuilder`/`StringBuffer`)、查找与替换(`indexOf()`, `replace()`, `replaceAll()`)、分割(`split()`)等操作。 5. **字符串与字符数组的转换**:`...

    js实战之全部替代一个子串为另一个子串.pdf

    方法一:使用String.prototype.replace()方法 String.prototype.replace()方法是JS中最基本的字符串替换方法。该方法可以使用正则表达式或字符串作为参数,以便实现字符串的替换。例如: `const s = 'hello. hello...

    javastringreplaceALL()用法.pdf

    ### Java中的`String.replaceAll()`方法详解 #### 一、引言 `String.replaceAll()`方法是Java编程语言中用于字符串操作的一个强大工具。该方法允许开发者使用正则表达式来进行模式匹配,并通过替换来修改字符串中的...

    Js 回车换行处理的办法及replace方法应用

    js里没有replaceAll的函数,需要我们自定义 代码如下: String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); } 2、使用js的replace进行处理 代码如下: str=str....

    Java中replace、replaceAll和replaceFirst函数的用法小结

    Java中的`replace`、`replaceAll`和`replaceFirst`是字符串操作中常见的方法,用于替换字符串中的特定子串。它们都是`String`类的方法,但各自有不同的行为和用途。 1. `replace(CharSequence target, CharSequence...

    PB_ReplaceAll

    new_string = old_string.ReplaceAll(find_string, replace_string) ``` - `old_string`:这是原始字符串,你要在这个字符串中进行查找和替换。 - `find_string`:这是你要查找并替换的子串。 - `replace_string`:...

    Java String.replace()方法"无效"的原因及解决方式

    在使用Java String类型的replace和replaceAll方法时,我们需要注意这种机制,不要以为replace和replaceAll方法会修改原来的字符串对象,而是需要将返回值赋值给一个新的字符串对象。 补充知识:Java String字符串...

    浅谈Java中replace与replaceAll区别

    "浅谈Java中replace与replaceAll区别" Java 中的字符串 replacement 是一个非常重要的知识点,今天我们就来探讨 Java 中的 replace 和 replaceAll 方法之间的区别。 首先, lets Talk about Java 中的 replace ...

    JavaScript实现格式化字符串函数String.format

    3. 为了方便起见,将引号转义符号设置为单引号('),并通过replaceAll方法将所有的百分号('%')替换为引号转义符号。 示例代码中展示了如何使用封装好的String.format方法来格式化字符串,并将格式化后的字符串设置到...

    proposal-string-replaceall:ECMAScript建议

    与字符串参数一起使用时, String.prototype.replace仅影响首次出现。 有很多证据表明开发人员正在尝试使用JS进行此操作-请参阅具有成千上万票的。 当前,最常见的实现方法是使用全局正则表达式。 const ...

    Java的 String 类常用方法大全

    Java 中的 String 类提供了三种方法来实现字符串的替换,分别是 replace、replaceAll 和 replaceFirst。 1. replace 方法 replace 方法将字符串中所有出现的 oldChar 字符串替换为 newChar 字符串。如: String ...

    2-Junit-String.rar

    标题中的“2-Junit-String.rar”显然与Java编程中的单元测试工具有关,特别是Junit框架和字符串处理。Junit是Java编程语言中最广泛使用的单元测试框架,它允许开发者编写可执行的测试用例来验证代码的功能是否按预期...

    js使用正则实现ReplaceAll全部替换的方法

    第三种方法尤其有用,因为它可以直接调用,语法上与Java或其他一些语言的replaceAll方法一致,提高了代码的可读性和易用性。 此外,文中还提到了两个JavaScript正则表达式工具网站,提供了在线测试和在线生成正则...

    org.apache.commons.lang3.StringUtils.jar.rar

    4. **替换操作**:`StringUtils.replace()` 和 `StringUtils.replaceAll()` 可用于执行简单的或正则表达式的字符串替换。 5. **比较操作**:`StringUtils.equals()` 和 `StringUtils.equalsIgnoreCase()` 是安全的...

    JS-removing-spaces-in-the-string.zip_javascript

    2. **trimStart()** 和 **trimEnd()**: 这两个方法分别用于移除字符串开头和结尾的空白字符,它们是在 ES2018 中引入的新特性,与 `trim()` 方法类似,但更具有针对性。 示例: ```javascript let str = " hello ...

    js代码-string.js

    - `match()`、`search()`、`replace()` 和 `split()` 都可以与正则表达式结合使用,进行更复杂的查找和替换。 14. **ES6新特性**: - `padStart(length[, fillString])` 在字符串前面填充,使总长度达到指定值。 ...

    java去除空格、标点符号的方法实例.docx

    在Java中,去除空格可以使用trim()、replace()、replaceAll()等方法。 1. 使用trim()方法去除首尾空格 trim()方法可以去除字符串的首尾空格,但是不能去除中间的空格。例如: ```java String str = " hello world ...

Global site tag (gtag.js) - Google Analytics