【问题标题】:Regex lazy matching正则表达式延迟匹配
【发布时间】:2020-07-09 20:06:51
【问题描述】:

我有这个字符串

(Mozilla/5.0 \(X11; Linux x86_64\) AppleWebKit/537.36 \(KHTML, like Gecko\) Chrome/data Safari/data2) /Producer (Skia/PDF m80) /CreationDate (D:20200420090009+00'00') /ModDate (D:20200420090009+00'00')

我想在 ( 或 ) 之前没有任何 \ 的情况下获得 () 的第一次出现。这种情况我会得到

(Mozilla/5.0 \(X11; Linux x86_64\) AppleWebKit/537.36 \(KHTML, like Gecko\) Chrome/data Safari/data2)

我正在使用这个正则表达式

\([\s\S]*[^\\]{1}\)?

但是我得到了整个字符串

【问题讨论】:

  • 在 perl 中还是在 python 中?你试过什么?什么不起作用?
  • 我正在处理 PDF 文件的内容。它有字典。我必须保存键/值

标签: regex user-agent


【解决方案1】:

你的正则表达式可以这样分解。

[空格和换行是为了清楚起见]

\(             match a literal (
  [\s\S]*      match 0 or more of whitespace or not-whitespace (anything)
  [^\\]{1}     match 1 thing which is not \
\)?            optionally match a literal )

regex101 demo

这就是[\s\S]*,它最终会在所有东西中啜饮。

最后的? 并不意味着懒惰,它使匹配) 成为可选的。为了懒惰,? 必须放在开放式限定符之前,例如 *?+?{3,}?{1,5}?


为了只匹配第一组括号,我们想要惰性匹配非转义括号之间的任何内容。懒惰匹配任何东西都很容易.*?

匹配未转义的括号有点困难。我们可以匹配[^\\]\),但这需要一个字符来匹配。如果左括号位于字符串的开头,这将不起作用,因为( 之前没有字符。我们也可以通过匹配字符串的开头来解决这个问题:(?:[^\\]|^)\)

(?:           non-capturing group
  [^\\]         match a non \
  |             or
  ^             the beginning of the string
) 
\(            match a literal (
  .*?         lazy match 0 or more of anything
[^\\]         match a non \ 
\)            match a literal )

regex101 demo

但这会被() 阻止。 It will match all of ()(foo).

(?:[^\\]|^) 匹配字符串的开头。 \( 匹配第一个 (。这让.*?[^\\]\) 看着)(foo)。第一个 ) 不匹配,因为没有前导字符,它已经被消耗掉了。所以.*? 吞噬字符直到他的o) 匹配[^\\]\)

negative look behinds更好地解决了边界问题。 (?<!\\) 表示前面的字符不能是\,它根本不包含任何字符。 Lookbehinds 不会消耗它们匹配的内容,因此它们可以用来窥视前后。大多数(但不是全部)正则表达式引擎都支持它们。

(?<!\\) \(    match a literal ( which is not after a \
  .*?         lazy match 0 or more of anything
(?<!\\) \)    match a literal ) which is not after a \

regex101 demo


但是,有一些库可以解析用户代理。 ua-parser 拥有多种语言的库,

【讨论】:

  • 很好的解释。这个 ^((?:[^\]|^)(.*?[^\]))\s*([\s\S]*) 正在工作。我可以得到下一个键的开始
猜你喜欢
  • 1970-01-01
  • 2020-09-24
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2011-05-01
相关资源
最近更新 更多