如何在正则表达式

时间:2015-12-11 20:25:55

标签: php regex bash pattern-matching

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

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

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

到目前为止,我有这样的想法:

^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 `('

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

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

第一个答案有效。我用这段代码来测试:

<?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}$/'

答案 2 :(得分:0)

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

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

<强> Working demo

enter image description here

答案 3 :(得分:0)

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

$ grep -Eo 'member_[0-9_]+\.(.*)$' file

member_1235435.dat
member_1243533.txt
member_1_1_2015.txt

答案 4 :(得分:0)

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

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

但是,您可以使用扩展的globs,如上面链接的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