1

我有一个文件,其列表如下所示:

    $ABC01
    $ABC02
    $ABC03
    $ABC04
    $ABC05

我想要所有那些不是$ABC02. 这是代码的一部分,在此步骤之前,我将字符串 ABC 记录在一个变量中,将数字 02 记录在另一个变量中。我基本上想要所有以 ABC 开头的条目,并以除02.

我试过这个,但它不工作:

/^\$ABC[^02]$/

在这种情况下要使用的正确正则表达式是什么?

4

3 回答 3

2

您的正则表达式当前所做的是找到“$ABC”后跟一位数字。您需要将其拆分[^02]为匹配的 2 个字符,如下所示。

/^\$ABC[^0][^2]$/

...但是...这也将匹配末尾有非数字的字符串。因此,与其使用你不想找到的东西,不如放入你想要找到的东西。

/^\$ABC([1-9][0-9]|0[013-9])$/

这将查找 1 到 9 后跟任何数字或 0 后跟除 2 之外的任何数字。如果您不想要捕获组,可以将(...)替换为。(?:...)

于 2018-06-19T10:49:44.240 回答
2

请注意,这[^02]是一个否定字符类,它匹配除0and之外的任何字符2,并且它不必是数字,顺便说一句。

您可以使用(?!02$)负前瞻C来避免匹配以 结尾02但以任何其他数字(包括0210等)结尾的字符串:

/^\$ABC(?!02$)[0-9]+$/

看到这个正则表达式演示

如果您不想匹配C*start with 之后的数字,请从前瞻02中删除:$

/^\$ABC(?!02)[0-9]+$/

查看另一个正则表达式演示

于 2018-06-19T10:52:07.160 回答
0

看起来您只需要从文件中删除一个特定的行。$ABC与其编写一个花哨的正则表达式模式来匹配除 之外的任何内容,不如02简单地使用该语言来丢弃给定的字符串。就像是print if not /\$ABC02/

在 Perl 单行命令中,这会检查整行是否与值匹配,如果匹配则忽略它

perl -ne 'print unless /^\$ABC02$/' myfile
于 2018-06-19T10:59:35.933 回答