python string.replace,pythonreplace函数替换字符串
替换中每个方法的定义
一。替换第一方法
publicstringreplacefirst(字符串正则表达式,字符串替换){
returnpattern.compile .火柴人(这个)。replacefirst)替换;
}
二。更换方法
公共字符串替换(charsequencetarget,char序列替换) {
返回pattern.com堆(target.tostring(,Pattern .文字)。匹配器)这个)。匹配器
}
三。替换全部方法
公共字符串替换全部(字符串正则表达式,字符串替换) {
returnpattern.compile .火柴人(这个)。全部替换)替换;
}
替换的各种方法的原理
我们用以下的例子分析他们的原理。
@测试
公共空间字符串替换(
替换第一个( year=1929.month=07,day=29,other=\ \ d { 2 } );
}
publicavoidereplacefirst(字符串) {
系统。出去。println(字符串。首先替换((\ d { 2 }),-);
系统。出去。println(字符串。替换( \ d { 2 } ,-);
系统。出去。println(字符串。替换( 29 ,-);
系统出去。println(字符串。替换所有((\ d { 2 })、-);
}
//year=- 29 .月=07,日=29,其他=\d{2}
//年份=1929年。月=07,日=29,其他=-
//year=19 -.month=07,day=-,other=\d{2}
//year=-1 .月=-,日=-,其他=\d{2}
一。首先,让我们分析替换优先和全部替换方法。他们的区别在于,匹配器在生成模式后调用的方式不同。一个是收获第一,另一个是全部替换方法。这两种方法现在可以分析。
1、首先是制榫机的首先替换方法:您可以看到只调用一次的附件替换和附录尾方法。关于附件替换方法,可以稍后发布源代码,实现起来很复杂
publicstringreplacefirst(字符串替换) {
如果(替换==空)
thrownewnullpointerexception(替换);
重置(;
如果(!find())
返回文字。tostring(;
字符串缓冲区sb=新字符串缓冲区(;
应用替换(sb,替换;
附录(某人;
将某人返回字符串(;
}
2、对制榫机的全部替换方法与上述的替换优先方法类似。只不过是多次调用了附件替换的替换函数。直到不一致
公共字符串替换全部(字符串替换) {
重置(;
布尔结果=find(;
如果(结果) {
字符串缓冲区sb=新字符串缓冲区(;
做{
应用替换(sb,替换;
结果=查找(;
}而(结果);
附录(某人;
返回
某人(somebody的简写)tostring();
}
返回文字。tostring();
}
二、对于替换方法,和上述的全部替换方法主要有以下两种区别。
1、在模式。编译时,添加了模式。逐字的的旗帜,表示模式会把正则表达式当作纯文本来处理了。比如\d{2}不转义成两个0-9的数字,而是当作纯文本\d{2}看待。
2、在调用火柴人火柴人。报价替换(替换。tostring())方法对更换做了对特殊符号($和)作去除转义的操作。
公共静态字符串引用替换(字符串){
if((的s .索引( \ \ )==-1)(的s .索引( $ )==-1))
返回s;
StringBuilder sb=new StringBuilder();
for(int I=0;我
char c=s . charat(I);
if (c==\\ c==$) {
某人(somebody的简写)追加( \ \ );
}
某人追加(c)和:
}
归还某人。tostring();
但是为何只对\和$做处理呢?
三、以下是我们的重点附件替换方法
一公共匹配器appendReplacement(字符串缓冲区sb,字符串替换){
2
3 //如果不匹配,返回错误
4如果(前0)
5抛出新的IllegalStateException("无可用匹配");
6
7 //处理替换字符串,用组替换组引用
8 int cursor=0;
9 StringBuilder result=new StringBuilder();
10
11 while(游标替换。长度()){
12 char next char=替换。charat(光标);
13 if (nextChar==\\) {
14光标;
15 if(cursor==replacement。长度())
16抛出新的IllegalArgumentException("缺少要转义的字符");
17下一个char=替换。charat(光标);
18个结果。追加(下一个字符);
19光标;
20 } else if (nextChar==$) {
21 //跳过美元
22光标;
23 //如果这个 $ 是替换的最后一个字符,抛出高等教育协会
24 if(cursor==replacement。长度())
25抛出新的IllegalArgumentException(非法组引用:缺少组索引);
26下一个char=替换。charat(光标);
27 int ref num=-1;
28 if (nextChar=={) {
29光标;
30 StringBuilder gsb=new StringBuilder();
31 while(游标替换。长度()){
32下一个字符=替换。charat(光标);
33 if (ASCII.isLower(nextChar)
34 ASCII.isUpper(nextChar)
35 ASCII.isDigit(nextChar)) {
36 gsb。append(nextChar);
37光标;
38 }其他{
39破;
40 }
41 }
42 if (gsb.length()==0)
43抛出新的IllegalArgumentException("命名捕获组长度名称为0");
44 if (nextChar!=})
45抛出新的IllegalArgumentException(命名捕获组缺少尾部 } );
46字符串gname=gsb。tostring();
47 if(ascii。是数字(gname。charat(0)))
48抛出新的IllegalArgumentException(捕获组名{ gname }以数字字符开头);
49如果(!parentPattern.namedGroups().containsKey(gname))
50抛出new IllegalArgumentException(“没有名为{ gname } 的组”);
51参考编号=父模式。命名组().get(gname);
52光标;
53 }其他{
54 //第一个数字总是一组
55 ref num=(int)nextChar- 0 ;
56 if ((refNum 0)(refNum 9))
57抛出新的IllegalArgumentException(非法组引用);
58光标;
59 //捕获最大合法组字符串
60布尔done=false
61 while(!完成){
62如果(光标=替换。长度()){
63破;
64 }
65 int下一位=替换。charat(cursor)-“0”;
66 if((下一位0) (下一位9)){//不是数字
67破;
68 }
69 int newref num=(ref num * 10)下一位数字;
70 if (groupCount() newRefNum) {
71完成=真;
72 }其他{
73 refNum=newRefNum
74光标;
75 }
76 }
77 }
78 //附加组
79 if (start(refNum)!=-1 end(refNum)!=-1)
80 result.append(text,start(refNum),end(ref num));
81 }其他{
82个结果。append(nextChar);
83光标;
84 }
85 }
86 //附加插入文本
87 sb.append(text,lastAppendPosition,first);
88 //追加匹配替换
89 sb。追加(结果);
90
91 lastAppendPosition=最后一个
92还这个;
93 }
四、以下是附录尾的代码
公共字符串缓冲区appendTail(字符串缓冲区sb){
sb.append(text,lastAppendPosition,getTextLength());
归还某人;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。