简体   繁体   English

如何在正则表达式上匹配模式但匹配模式

[英]How to match a pattern but a pattern on regex

If I have a list of filename eg: 如果我有一个文件名列表,例如:

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

How can I match all within a pattern of member_{number}.extension except those with _rejected ? 我如何匹配member_ {number} .extension模式中的所有内容(具有_rejected除外)?

So far I have like this: 到目前为止,我是这样的:

^Member_.*.*

I thought it will look like this, but it does not work. 我以为它将看起来像这样,但是它不起作用。

^Member_.*(?!_rejected).*

I tried the first answer in comment 我在评论中尝试了第一个答案

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

I tried to escape ! 我试图逃脱! sign, this is what I got 标志,这就是我得到的

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

FYI, the pattern will go through command line argument 仅供参考,该模式将通过命令行参数

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

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

The first answer works. 第一个答案有效。 I've used this code to test: 我已使用此代码进行测试:

<?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';

In case you want to use a extension with 3 letters, use '/^member_[\\d_]+\\.\\w{3}$/' . 如果要使用3个字母的扩展名,请使用'/^member_[\\d_]+\\.\\w{3}$/'

You can use the discard technique by using a regex like this: 您可以通过以下正则表达式使用丢弃技术:

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

Working demo 工作演示

在此处输入图片说明

using the ".ext" as the terminator after the numerical term. 在数字项之后使用“ .ext”作为终止符。

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

member_1235435.dat
member_1243533.txt
member_1_1_2015.txt

In bash, filename patterns are not regexes. 在bash中,文件名模式不是正则表达式。 They are "globs" . 它们是“团”

Even where regexes are possible, such as inside [[...]], lookahead assertions are not implemented. 即使在可能出现正则表达式的地方,例如[[...]内部,也不会实现超前断言。

However, you can use extended globs, as described in the bash guide linked above: 但是,您可以使用扩展的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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM