IDL中一个好用的字符串替换的函数replace_string

 
;
; Copyright (c) 1998, Forschungszentrum Juelich GmbH ICG-1
; All rights reserved.
; Unauthorized reproduction prohibited.
; This software may be used, copied, or redistributed as long as it is not
; sold and this copyright notice is reproduced on each copy made.  This
; routine is provided as is without any express or implied warranties
; whatsoever.
;
;+
; NAME:
;  replace_string
;
; PURPOSE:
;   This function replaces in a given string or vector of strings all values by an other. Length or only one char didn't matter.
;   It could also be used to delete a substring from a string.
;
; CATEGORY:
;   PROG_TOOLS/STRINGS
;
; CALLING SEQUENCE:
;   Result=replace_string(text,in_string,rep_string,[no_of_replaces=no_of_replaces],[pos=pos],[count=count])
;
; INPUTS:
;   text:       the text where to replace some informations
;   in_string:  the search string
;   rep_string: the string which should replace in_string
;
; KEYWORD PARAMETERS:
;   no_of_replace: if set two a number, this means in text as many times of no_of_replace in_string is reaplced by rep_string
;   pos:           if set to a number the replacement starts at this string position
;   count:         this argument returns the number of replaces
;
; OUTPUTS:
;   Result is the new text
;
; EXAMPLE:
;   help,replace_string('Dies ist ein Test',' ','_')
;   <Expression>    STRING    = 'Dies_ist_ein_Test'
;   help,replace_string('Dies ist ein Test',' ','_',pos=5)
;   <Expression>    STRING    = 'Dies ist_ein_Test'
;   help,replace_string('Dies ist ein Test',' ','_',pos=5,no=1)
;   <Expression>    STRING    = 'Dies ist_ein Test'
;   help,replace_string('Dies ist ein Test','ist','ist')
;   <Expression>    STRING    = 'Dies ist ein Test'
;   help,replace_string('Dies ist ein Test, ist ein','ist','ist nicht')
;   <Expression>    STRING    = 'Dies ist nicht ein Test, ist nicht ein'
;   help,replace_string('\\\\\\\\\','\','/')
;   <Expression>    STRING    = '/'
;   help,replace_string('["..\idl_html\idl_work_cat.htm"]','cat','cat_org')
;   <Expression>    STRING    = '["..\idl_html\idl_work_cat_org.htm"]'
;   print,replace_string(['12:33:00','12:33:00','12:33:00'],':',')
;   123300 123300 123300
;   print,replace_string(['12:33:00','12:33:00','12:33:00'],':',',pos=5)
;   12:3300 12:3300 12:3300
;   print,replace_string( 'asdf___ertz_j','__', ')
;   asdf_ertz_j
;   print,replace_string(['12:33:00','12:33:00','12:33:00'],':',',pos=5,count=c),c
;   12:3300 12:3300 12:3300
;   3
;   print,replace_string(['12:33:00','12:33:00','12:33:00'],':',',count=c),c
;   123300 123300 123300
;   6
;
;
; MODIFICATION HISTORY:
;  Written by: R.Bauer (ICG-1) , 1998-Sep-06
;   1998-09-26 bug removed with start_pos and a vector of strings
;   1998-09-26 special replacement include if a sign should be replaced by an other by n times
;   1999-09-07 bug removed with replacing '___' by '_'
;   1999-10-01 count added
;   2000-03-08 bug with no_of_replaces removed
;              if text is an array no_of_replaces is used for each element
;   2001-02-13 Loop in LONG
;   2004-06-03 added a test if submitted parameters have values
;-


FUNCTION replace_string,text,in_string,rep_string,pos=pos,no_of_replaces=no_of_replaces,count=count_n_replace

   IF N_PARAMS() LT 3 THEN BEGIN

;      MESSAGE,call_help(),/cont
      RETURN,'
   ENDIF

   If n_elements(text) eq 0 or n_elements(in_string) eq 0 or n_elements(rep_string) eq 0 then begin
     MESSAGE,/cont, 'problem by passig parameters, please check the input data variables'
     RETURN,'
   endif

   counter=0
   count_n_replace=0

   IF N_ELEMENTS(no_of_replaces) GT 0 THEN number=no_of_replaces ELSE number=1E+30

   length_in_string=STRLEN(in_string)
   length_rep_string=STRLEN(rep_string)

; Sonderfall, wenn genau 1 Zeichen der Lanege 1 durch 1 anderes Zeichen der Laenge 1 und n mal ersetzt werden soll
; Dieses Verfahren ist einfach schneller
   IF length_rep_string NE 0 THEN BEGIN
      IF length_in_string + length_rep_string EQ 2 AND number EQ 1E+30 THEN BEGIN
         new_text=BYTE(text)
         IF N_ELEMENTS(pos) EQ 0 THEN BEGIN
            change=WHERE(new_text EQ ((BYTE(in_string))[0]),count_change)
            IF count_change GT 0 THEN new_text[change]=(BYTE(rep_string))[0]
            ENDIF ELSE BEGIN
            change=WHERE(new_text[pos:*] EQ ((BYTE(in_string))[0]),count_change)
            IF count_change GT 0 THEN new_text[pos+change]=(BYTE(rep_string))[0]
         ENDELSE
         count_n_replace=count_change
         RETURN,STRING(new_text)
      ENDIF
   ENDIF

; alle anderen Faelle werden so behandelt
   IF N_ELEMENTS(pos) EQ 0 THEN start_pos=0 ELSE start_pos=pos

   n_text=N_ELEMENTS(text)-1

   FOR i=0L,n_text DO BEGIN
   counter=0
      new_text=text[i]
      IF STRPOS(new_text,in_string) NE -1 AND in_string NE rep_string THEN  BEGIN
         pos_in_string=1
         text_length=STRLEN(new_text)
         WHILE pos_in_string NE -1 AND counter LT number DO BEGIN
            pos_in_string=STRPOS(new_text,in_string,start_pos)
            IF pos_in_string GT -1 THEN BEGIN
               count_n_replace=count_n_replace+1
               new_text=STRMID(new_text,0,pos_in_string)+rep_string+STRMID(new_text,pos_in_string+length_in_string,text_length)
               start_pos=pos_in_string+length_rep_string
            ENDIF
            counter=counter+1
         ENDWHILE
         if n_elements(result) eq 0 then result=new_text else result=[result,new_text]
         IF N_ELEMENTS(pos) EQ 0 THEN start_pos=0 ELSE start_pos=pos
         ENDIF ELSE BEGIN
         if n_elements(result) eq 0 then result=new_text else result=[result,new_text]
         IF N_ELEMENTS(pos) EQ 0 THEN start_pos=0 ELSE start_pos=pos
      ENDELSE

   ENDFOR
   RETURN,result

END


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值