【问题标题】:Check if string contains embedded string in order按顺序检查字符串是否包含嵌入的字符串
【发布时间】:2016-04-09 16:33:53
【问题描述】:

我想检查某个字符串是否嵌入在另一个字符串中。例如pineappleapple 匹配以及aepprestlseapple

如果我知道要测试的单词,这是一项简单的任务,例如:

if [[ $e == *"a"*"p"*"p"*"l"*"e"* ]]
then
   echo "match"
fi

但是,当我运行脚本时,我不知道将替换我的 "apple" 变量的长度或内容。如何使用可变大小/内容执行此检查?

【问题讨论】:

    标签: regex string bash


    【解决方案1】:

    以下是生成要匹配的 glob 模式的方法:

    data='bcdaeppr?estlse'
    search='app?le'
    
    # generate a regex using sed i.e. *\a*\p*\p*\?\l*\e*
    patt="*$(sed 's/./\\&*/g' <<< "$search")"
    
    # now match it
    [[ $data == $patt ]] && echo "matched" || echo "nope"
    matched
    
    # not matching example
    data='bcdaepprestlse'
    [[ $data == $patt ]] && echo "matched" || echo "nope"
    nope
    

    【讨论】:

    • 谢谢,我最终使用了一种愚蠢的方法,因为我以前没有使用过折叠,但这让我开始了
    • 你可以用sed 's/./&amp;.*/g;s/\.\*$//' &lt;&lt;&lt; apple创建同样的正则表达式
    • 如果搜索字符串包含一组受限制的字符,这是可以的,但在某些情况下可能会中断。搜索字符串中的空格字符将被忽略。通配符是在搜索字符串字符上完成的,所以如果搜索字符串包含*,就会发生奇怪的事情。如果搜索字符串包含像 .[ 和 `]' 这样的正则表达式元字符,也会发生奇怪的事情。
    • 好点 karakfa 和 @pjh。我现在已经对其进行了修改,以逃避 glob 模式并使用 globbing 进行匹配。
    【解决方案2】:

    awk 来救援!

    $ awk -v s='pineapple' -v r='apple' '
         BEGIN{for(i=1;i<=length(r);i++) 
                 {s=substr(s,k); 
                  k=index(s,substr(r,i,1)); 
                  if(k==0) exit 1} 
               exit 0}'; echo $? 
    

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 2011-11-09
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2014-09-17
      • 2012-05-16
      • 1970-01-01
      相关资源
      最近更新 更多