【问题标题】:matlab regexprepmatlab 正则表达式
【发布时间】:2014-02-25 00:42:38
【问题描述】:

如何使用 matlab regexprep 进行多个表达式和替换?

file='http:xxx/sys/tags/Rel/total';

我想用 sys1 替换“sys”,用“total1”替换“total”。对于单个表达式,替换它的工作方式如下:

strrep(file,'sys', 'sys1')

想拥有喜欢的

strrep(file,'sys','sys1','total','total1') . 

我知道这不适用于strrep

【问题讨论】:

    标签: matlab


    【解决方案1】:

    为什么不直接发出命令两次?

    file = 'http:xxx/sys/tags/Rel/total';
    
    file = strrep(file,'sys','sys1')
    strrep(file,'total','total1')
    

    【讨论】:

    • Helo Rody,感谢您的回复,但我的意图不是两次发出命令。我想同时替换 2 个表达式,我必须使用类似 'evalc(strrep(file,exp,rep,exp,rep))'。对正则表达式有任何想法吗?谢谢
    • @bstar:“我必须”从来都不是一个好的理由。为什么两次传球不好?
    【解决方案2】:

    要解决它,您需要 用正则表达式替换功能,尝试在 matlab 的正则表达式中找到与 php 中类似的内容:

    $string = 'http:xxx/sys/tags/Rel/total';
    preg_replace('/http:(.*?)\//', 'http:${1}1/', $string);  
    

    ${1} 表示第一个匹配组,即括号中的内容,(.*?)

    http:(.*?)\/ - 匹配模式

    http:${1}1/ - 用你希望添加的第二个 1 替换模式(第一个 1 是组号)

    http:xxx/sys/tags/Rel/total - 输入字符串

    秘诀在于(.*?)匹配的任何内容(无论是xxx还是yyyy还是1234)都将被插入而不是@987654329 @ 在替换模式中,然后将旧内容替换为输入字符串。欢迎在php中查看substitute functionality的更多示例。

    【讨论】:

      【解决方案3】:

      regexprep 的帮助页面中所述,您可以指定成对的模式和替换,如下所示:

      file='http:xxx/sys/tags/Rel/total';
      regexprep(file, {'sys' 'total'}, {'sys1' 'total1'})
      
      ans =
      http:xxx/sys1/tags/Rel/total1
      

      如果您能够为要替换的所有内容定义匹配模式,甚至可以使用标记:

      regexprep(file, '/([st][yo][^/$]*)', '/$11')
      
      ans =
      http:xxx/sys1/tags/Rel/total1
      

      但是,在某些情况下必须小心使用第一种方法,因为 MATLAB 会一个接一个地替换这些对。也就是说,如果第一个模式匹配一​​个字符串并将其替换为随后由后面的模式匹配的内容,那么它也将被后面的替换替换,即使它可能不匹配后面的模式原始字符串。

      例子:

      regexprep('This\is{not}LaTeX.', {'\\' '([{}])'}, {'\\textbackslash{}' '\\$1'})
      
      ans =
      This\textbackslash\{\}is\{not\}LaTeX.
      
      => This\{}is{not}LaTeX.
      

      regexprep('This\is{not}LaTeX.', {'([{}])' '\\'}, {'\\$1' '\\textbackslash{}'})
      
      ans =
      This\textbackslash{}is\textbackslash{}{not\textbackslash{}}LaTeX.
      
      => This\is\not\LaTeX.
      

      这两个结果都是意料之外的,而且似乎没有办法通过连续替换而不是同时替换来解决这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        相关资源
        最近更新 更多