如何将一个字符作为表达式的结尾

How to put a character as end of expression

我有这个正则表达式

url\s*\((?:\'|"|)((\S*|\?)(?<!\'|\"))(?=\'\)|"\)|\))

在这些情况下它很适合我想要的:

url("../../Common/common/fonts/lato/lato-black-webfont.svg?#lato_blackregular")

但是当我遇到这样的情况时,它并没有按照我想要的方式工作

lato_blackregular;src:url("../../Common/common/fonts/lato/lato-black-webfont.eot");src:url("../../Common/common/fonts/lato/lato-black-webfont.eot?#iefix")

如何定义“;”例如换行符,只要你有一个“;”组合并重新开始?

正在发生的事情的演示: https://regex101.com/r/2YHl2C/1/

使用 \S*? 无效,因为它停止与 background:url(/uploads/2019/03/0002-image(thumbnail_product).jpg)

正确组合

您可以使用

url\s*\(['"]?(.*?)['"]?\)(?![^;\s])

参见regex demo

该模式将匹配以 url( 开头的子字符串,然后可能有一个可选的单引号或双引号,然后会将零个或多个字符捕获到组 1 中,直到第一个 )使用 ; 或 whitepsace/end 的字符串。

参见 Regulex graph:

详情

  • url - url 字符串
  • \s* - 0+ 个空白字符
  • \( - 一个 ( 字符
  • ['"]? - 1 或 0 个引号
  • (.*?) - 第 1 组:除换行字符外的任何零个或多个字符,尽可能少
  • ['"]? - 1 或 0 个引号
  • \) - 一个 ) 字符
  • (?![^;\s]) - 当前位置右侧必须有 ;、空格或字符串结尾。

虽然您已经有了答案,但 imo 更清洁(递归)方式呢:

url
(\(
    (?P<url>(?:[^()]*|(?1))+)
\))

这只需要@Wiktor 表达式所需步骤的十分之一(~4000 vs 400),参见your modified demo on regex101.com