【问题标题】:How to match string (with regular expression) that begins with a string如何匹配以字符串开头的字符串(使用正则表达式)
【发布时间】:2015-07-07 14:31:28
【问题描述】:

在 bash 脚本中,我必须匹配以字符串 lo 开头正好 3 次的字符串;所以lololoba 好,loloba 不好,lololololoba 好,balololo 不好。

我尝试了这种模式:"^$str1/{$n,}" 但它不起作用,我该怎么做?

编辑:

根据 OP 的评论,lololololoba 现在很糟糕。

【问题讨论】:

  • (lo){3} 呢?
  • 那么lo出现3次以上也不错?
  • @anubhava 我认为是,但exactly 令人困惑。
  • 对不起,但那一刻我处于愤怒模式,我写错了,超过 3 个是坏的,所以“lolololoba”不好!
  • 好的,我提供了一个答案,只匹配开始时正好为 3 lo 的行。

标签: regex linux bash


【解决方案1】:

这应该可行:

pat="^(lo){3}"
s="lolololoba"
[[ $s =~ $pat ]] && echo good || echo bad

编辑(根据 OP 评论):

如果您想精确匹配 3 次(即 lolololoba 等应该不匹配):

pat="^(lo){3}" 更改为:

pat="^(lo){3}(l[^o]|[^l].)"

【讨论】:

    【解决方案2】:

    您可以使用以下正则表达式:

    ^(lo){3}.*$
    

    你可以用你的变量代替lo

    查看演示https://regex101.com/r/sI8zQ6/1

    【讨论】:

    • 不需要.*$ - 它没有任何用处。此外,虽然这是一个有效的正则表达式,但如果不展示如何使用它(例如使用grep -E),它就不是一个完整的答案。
    • \1 有什么意义?为什么不只匹配字符串 3 次?
    • @TomFenech 是的,你是对的,但我想给出一个提示而不是完整的答案!
    • 嗯,为什么不让你的答案更有用呢?
    • 另请注意,这将匹配太多,例如它将匹配lolololoba OP 说不好
    【解决方案3】:

    您可以使用此awk 来匹配精确 3 次出现在开头的lo

    # input file
    cat file
    lololoba
    balololo
    loloba
    lololololoba
    lololo
    
    # awk command to print only valid lines
    awk -F '^(lo){3}' 'NF == 2 && !($2 ~ /^lo/)' file
    lololoba
    lololo
    

    【讨论】:

      【解决方案4】:

      根据您的评论:

      ... more than 3 is bad so "lolololoba" is not good! 
      

      你会发现@Jahid 的答案不合适(因为他给你的测试字符串“好”。

      用正确的正则表达式使用他的答案:

      pat="^(lo){3}(?\!lo)"
      s="lolololoba"
      [[ $s =~ $pat ]] && echo good || echo bad
      

      这验证了开头有三个“lo”,而不是紧跟在三个之后的另一个。

      请注意,如果您使用 bash,则必须在第一行中转义 !(这是我上面的正则表达式所做的)

      【讨论】:

      • 如果你有兴趣,我已经添加了另一个模式。
      猜你喜欢
      • 2016-07-12
      • 2014-08-15
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2019-10-15
      • 2022-08-03
      相关资源
      最近更新 更多