主要就是后者是基于正则表达式的替换,而前者是一般的基于字符或字符序列本身的替换。
比如,可以通过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的ES Proposal规范填充程序。 如果不可用或不String.prototype....// replaceAll and replace are the same, when given a global regex to replace as
js里没有replaceAll的函数,需要我们自定义 代码如下: String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); } 2、使用js的replace进行处理 代码如下: str=str....
与字符串参数一起使用时, String.prototype.replace仅影响首次出现。 有很多证据表明开发人员正在尝试使用JS进行此操作-请参阅具有成千上万票的。 当前,最常见的实现方法是使用全局正则表达式。 const ...
主要介绍了Java String.replace()方法"无效"的原因及解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
"string".replaceAll(search: string, replace: string) "aaa" . replaceAll ( "a" , "b" ) ; // => bbb 对"aaa".replace("a", "b"); // => "baa"的修复"aaa".replace("a", "b"); // => "baa" "aaa".replace("a", ...
String.prototype.replaceAll = function(str1, str2) { return this.replace(new RegExp(str1, "gm"), str2); } // 清除空格 String.prototype.trim = function() { return this.replace(/^\s*(.*?)\s+$/, "$1");
String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) { if (!RegExp.prototype.isPrototypeOf(reallyDo)) { return this.replace(new RegExp(reallyDo, (ignoreCase ? “gi”: “g...
方法: string.replace(new RegExp(oldString,”gm”),newString)) gm 分别代表: g=global, m=multiLine 大致上方法就是这样的,可以实现替换全部指定字串 另一个简单的验证JS的方法: 在浏览器地址栏输入 [removed]...
stringObj.replace(rgExp, replaceText) 参数 stringObj 必选项。要执行该替换的 String 对象或字符串文字。该字符串不会被 replace 方法修改。 rgExp 必选项。为包含正则表达式模式或可用标志的正则表达式对象...
str = path.replace(this.rootPath.replaceAll("\\/", "\\\\"), "\\"); }else{ str = path.replace(this.rootPath, "/"); } //System.out.println("操作系统类型>>>>"+System.getProperty("os.name")); ...
代码如下:String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); }; (function($){ /* * $-layer 0.1 – New Wave Javascript * * Copyright (c) 2008 King Wong * $Date...
代码如下:String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); }; (function($){ /* * $-layer 0.1 – New Wave Javascript * * Copyright (c) 2008 King Wong ...
代码如下:String.prototype.replaceAll = function(s1,s2){ return this.replace(new RegExp(s1,”gm”),s2); }; (function($){ /* * $-layer 0.1 – jquery pulg-in * * Copyright (c) 2008 King Wong * $Date: ...
主要介绍了C++中string替换所有指定字符串的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
a = a.replaceAll(r, “$1.gif”); System.out.println(a); 打印出的结果是:5.gifaa88887.gif 大家可以尽兴发挥。 您可能感兴趣的文章:C#将隐私信息(银行账户,身份证号码)中间部分特殊字符替换成*PHP的substr_...
replace() The replace() method returns the string that results when you replace text matching its first argument (a regular expression) with the text of the second argument (a string).
replace() The replace() method returns the string that results when you replace text matching its first argument (a regular expression) with the text of the second argument (a string). If the g ...
private final String windowsParseMacAddress(String ipConfigResponse) throws java.text.ParseException { String localHost = null; try { localHost = java.net.InetAddress.getLocalHost().getHostAddress(); ...
这个工程简单写了如何使用replace替换字符串的反斜杠,有需要的可以下载
//10行代码搞定金额大小写转换//原创 渴死的鱼 hanlin2020@hotmail.com//改编 inRm inrm@263.... for i:= 0 to 11 do //去掉多余的零 result := StringReplace(result, cCha[0,i], cCha[1,i], [rfReplaceAll]);end;