1

我有以下正则表达式规则:

'/((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/'

它工作得很好,但我不希望它匹配任何前面有换行符和 4 个或更多空格的东西,这意味着这样的事情:

"\n    "

怎么能做到这一点?

4

2 回答 2

1

我在行首添加了一个负前瞻。它检查是否存在后跟 4 个或更多空白字符的换行符。如果此条件存在,则匹配将失败。

'/^(?!\n\s{4,}).*((f|ht)tp)(.*?)(.gif|.png|.jpg|.jpeg)/'
于 2013-02-20T00:17:45.323 回答
1

您不需要在前瞻中包含换行符本身,只需^在多行模式下使用起始锚 ( )。此外,由于\s可以匹配包括换行符和制表符在内的所有类型的空格,所以最好使用文字空格字符:

'/^(?! {4}).*(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'

说到制表符,它们可以用来代替四个空格在 SO 上创建代码块,因此您可能也希望允许这样做:

'/^(?! {4}|\t).*(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'

最后,如果您希望正则表达式仅匹配(如在consume中)URL,您可以使用 match-start-reset 运算符\K. 它就像一个积极的后视,没有固定长度的限制:

'/^(?! {4}|\t).*?\K(f|ht)tp(.*?)(.gif|.png|.jpg|.jpeg)/m'
于 2013-02-20T01:19:20.467 回答