正则表达式只获取特定行

时间:2018-07-23 15:46:32

标签: javascript regex

我试图仅提取特定行,之后再不包含任何其他字符。例如:

permit ip any any
permit oped any any eq 10.52.5.15
permit top any any (sdfg)
permit sdo any host 10.51.86.17 eq sdg

我只想匹配第一行permit ip any any而不匹配其他行。需要注意的是,第二个单词ip可以是任何单词。

意思是,我只发现permit (anyword) any any,如果第二个字符之后还有一个字符,则不匹配。

我尝试做\bpermit.\w+.(?:any.any).([$&+,:;=?@#|'<>.^*()%!-\w].+),但是找到了permit ip any any以外的其他行。我确实尝试进行反向查找,但没有成功。

2 个答案:

答案 0 :(得分:0)

在最后的“ any”和$多行正则表达式标志之后使用m行尾锚。

/^permit \w+ any any$/gm

https://regex101.com/r/FfOp5k/2

如果您使用的是基于Java的正则表达式,则可以在表达式中包含多行标志。 JavaScript regex不支持此语法。

(?m)^permit \w+ any$

答案 1 :(得分:0)

  

我尝试做\bpermit.\w+.(?:any.any).([$&+,:;=?@#|'<>.^*()%!-\w].+),但是找到了除allow ip any之外的其他所有行。我确实尝试进行反向查找,但没有成功。

让我们拆开您的正则表达式,看看您的正则表达式怎么说:

\b            # starting on a word boundary (space to non space or reverse)
permit        # look for the literal characters "permit" in that order
.             # followed by any character
\w+           # followed by word characters (letters, numbers, underscores)
.             # followed by any character
(?:           # followed by a non-capturing group that contains
    any       # the literal characters 'any'
    .         # any character
    any       # the literal characters 'any'
)   
.             # followed by any character <-- ERROR HERE!
(             # followed by a capturing group
[$&+,:;=?@#|'<>.^*()%!-\w] # any one of these many characters or word characters
.+            # then any one character one or more times
)

您描述的行为...

  

但是找到了除allow ip any any之外的其他行。

与您指定的内容匹配。具体来说,上方的正则表达式要求在“ any any”之后必须有字符。由于permit \w+ any anyany any部分后面没有任何字符,因此在我的细目分类中,正则表达式在<-- ERROR HERE!标记处失败。

如果必须捕获最后一个部分(使用捕获组),但是该部分可能不存在,则可以使用?字符使整个最后一个部分为可选。

这看起来像:

permit \w+ any any(?: (.+))?

细分:

permit    # the word permit
[ ]       # a literal space
\w+       # one or more word characters
[ ]       # a literal space
any       # the word any
[ ]       # another literal space
any       # another any; all of this is requred.
(?:       # a non-capturing group to start the "optional" part
    [ ]   # a literal space after the any
    (.+)  # everything else, including spaces, and capture it in a group
)?        # end non-capturing group, but make it optional