【问题标题】:How to match a pattern but a pattern on regex如何匹配模式但正则表达式上的模式
【发布时间】:2016-03-17 20:46:07
【问题描述】:

如果我有文件名列表,例如:

member_1235435.dat
member_1243533.txt
member_1_1_2015.txt
member_1_3_2015_rejected.dat

除了_rejected 之外,我如何匹配 member_{number}.extension 模式中的所有内容?

到目前为止,我是这样的:

^Member_.*.*

我原以为会是这个样子,但它不起作用。

^Member_.*(?!_rejected).*

我在评论中尝试了第一个答案

24646-MBPRS-Username:myapp Username$ ./src/myapp launcher:local ~/Desktop/myfilesdirectory /^member_(?:.(?!_rejected))*$/
-bash: !_rejected: event not found

我试图逃跑!签名,这就是我得到的

24646-MBPRS-Username:myapp Username$ ./src/myapp launcher:local ~/Desktop/myfilesdirectory /^member_(?:.(?\!_rejected))*$/
-bash: syntax error near unexpected token `('

仅供参考,该模式将通过命令行参数

【问题讨论】:

  • 你是否使用了不区分大小写的修饰符?
  • 是的。我正在使用不敏感的修饰符
  • ^member_(?:.(?!_rejected))*$ - regex101.com/r/cR9bF3/1
  • @JoshCrozier 我尝试运行它,它失败了:24646-MBPRS-Username:myapp username$ ./src/myapp launcher:local ~/Desktop/myfilesdirectory /^member_(?:.(?! _rejected))*$/ 结果 --> -bash: !_rejected: event not found
  • 在 bash 中,文件名模式不是正则表达式。它们是“球体”。 (即使可以使用正则表达式,例如在 [[...]] 内部,也不会实现前瞻断言。但是,您可以使用扩展的 glob。

标签: php regex bash pattern-matching


【解决方案1】:

如果可接受的名称在member_ 之后有数字和_ 的组合,您可以简单地使用以下正则表达式:

^member_[\d_]+\.\w+$

【讨论】:

    【解决方案2】:

    第一个答案有效。我已经使用此代码进行了测试:

    <?php
    $s = [
        'member_1235435.dat',
        'member_1243533.txt',
        'member_1_1_2015.txts',
        'mber_1_1_2015.txt',
        'member_1_3_2015_rejected.dat'
    ];
    
    echo preg_match('/^member_[\d_]+\.\w+$/', $s[1]) ? 'yes' : 'no';
    

    如果您想使用 3 个字母的扩展名,请使用 '/^member_[\d_]+\.\w{3}$/'

    【讨论】:

    • 它不起作用,当我在命令行上运行它时,它给了我 -bash: !_rejected: event not found
    • 好吧,我正在从 Eclipse/PDT 环境运行的 index.php 文件中尝试此代码。也许,bash 正在将一些代码解析为命令...
    【解决方案3】:

    您可以使用这样的正则表达式来使用丢弃技术:

    .*rejected(*SKIP)(*FAIL)|^.*
    

    Working demo

    【讨论】:

      【解决方案4】:

      使用“.ext”作为数字项后的终止符。

      $ grep -Eo 'member_[0-9_]+\.(.*)$' file
      
      member_1235435.dat
      member_1243533.txt
      member_1_1_2015.txt
      

      【讨论】:

        【解决方案5】:

        在 bash 中,文件名模式不是正则表达式。他们是"globs"

        即使在可以使用正则表达式的地方,例如在 [[...]] 内部,也不会实现前瞻断言。

        但是,您可以使用扩展的 glob,如上面链接的 bash 指南中所述:

        $ shopt -s extglob
        $ echo member_!(*_rejected*).dat
        member_1235435.dat
        $ echo member_!(*_rejected*).*
        member_1235435.dat
        member_1243533.txt
        member_1_1_2015.txt
        

        【讨论】:

          猜你喜欢
          • 2011-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多