python string.replace,pythonreplace函数替换字符串

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: