Perl正则表达式:寻找没有开头的关键字

时间:2016-07-09 17:53:29

标签: regex perl

示例1:f
示例2:ipfs add hello

我只想在示例1中捕获"hello this is me. KEYWORD: blah",而不是2,因为在2中,它以"KEYWORD: apple"

开头
KEYWORD

上面的代码捕获了两个示例。如何更改正则表达式,以便它只捕获示例1中的KEYWORD

PS最终我希望示例1为if ($line =~/KEYWORD:/x) { # do something }

5 个答案:

答案 0 :(得分:4)

如果您只是在寻找关键字,那么您应该使用index而不是正则表达式:

if (index($line, 'KEYWORD') > 0) {
    # do something
}

如果在index STR, SUBSTR中找不到-1,请the documentation SUBSTR返回STR,否则返回SUBSTR的索引在STR中(从0开始)。

如果你想寻找一个比简单关键字更复杂的模式,那么你应该按照@Perl Dog的回答说。

答案 1 :(得分:3)

您正在寻找一个 negative lookbehind assertion ,即对于的'KEYWORD',在某个字符串之前(在您的情况下是开始 - 行标记 ID Name Team Before after Loss 1 1011 David red 125 112 13 2 1024 Alice red 145 135 10 3 1036 Alan yellow 180 156 24 4 1039 Ashley red 145 130 15 5 1019 Diana yellow 128 109 19 ):

^

输出:

if ($line =~/(?<!^)KEYWORD:/x) {
    # found KEYWORD in '$line', but not at the beginning
    print $line, "\n";
}

更新:如评论中所述,hello this is me. KEYWORD: blah 修饰符在我的第一个正则表达式中不是必需的,但可用于使模式更具可读性。它允许模式中的空格(包括换行符)和/或注释来提高可读性。缺点是实际模式中的每个空格/空格字符都必须被转义(以区别于注释),但我们这里没有这些。因此可以如下重写该模式(结果是相同的):

/x

答案 2 :(得分:3)

答案其实很简单!

/.KEYWORD/    # Not at the start of a line
/.KEYWORD/s   # Not at the start of the string

顺便说一句,您可能希望在\b之前添加KEYWORD以避免匹配NOTTHEKEYWORD

答案 3 :(得分:1)

我认为你需要提供更好的,真实的例子

从表面上看,你需要的只是

if ( /KEYWORD/ and not /^KEYWORD/ ) {
     ...
}

答案 4 :(得分:1)

另一个简单的正则表达式

print if /^.+KEYWORD/;

匹配

hello this is me. KEYWORD: blah