regex - 与顺序无关的正则表达式 - 有可能吗?

标签 regex

我正在尝试匹配以下视频网址:

<iframe width="420" height="315" src="//www.youtube.com/embed/F40ZBDAG8-o?rel=0" frameborder="0" allowfullscreen></iframe>

我有以下内容:

^<iframe
(\swidth="\d{1,3}")?
(\sheight="\d{1,3}")?
(\salt=""[^""<>]*"")?
(\stitle=""[^""<>]*"")?
\ssrc="//(www.youtube.com|player.vimeo.com)/[-a-z0-9+&@#/%?=~_|!:,.;\(\)]+"
(\sframeborder="[^""<>]*")?
(\sallowfullscreen)?
\s?/?></iframe>$

这是有效的,但我不能相信 youtube 将始终提供遵循此结构的嵌入链接。如果他们将 width 属性移至 src 之后,我的正则表达式将失败。

有什么方法可以进行与顺序无关的分组来解决这个问题吗?

最佳答案

您可以将每个搜索词设置为前瞻 - 这些搜索词不会消耗字符串,因此它们可以按任何顺序排列。示例:

<iframe (?=.*height="\d{1,3}")(?=.*width="\d{1,3}").*

将匹配两者

<iframe width="123" height="321"

<iframe height="321" width="123"

demo on regex101.com

我相信您可以自己完成此操作(添加您想要匹配的所有术语)。

注意 - 这个“匹配” - 它不“提取”。但它会告诉您所有这些术语都以任何顺序出现在表达式中。

编辑自从我开始写这个答案以来,出现了许多评论,这些评论改变了我对您的请求的理解。如果您“只是”想提取 src= 内容,您只需这样做

<iframe.*?src="([^"]+)"

和匹配(括号中的内容)将是第一个和第二个双引号之间的任何内容。通常有比正则表达式更好的工具来解析 HTML - 我个人更喜欢 BeautifulSoup (Python)。

关于regex - 与顺序无关的正则表达式 - 有可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20576719/

相关文章:

regex - bash - 如何从 bash 脚本中将换行符传递给 perl?

regex - VBA积极的前瞻性太贪婪

java - 括号之间的简单正则表达式

Ruby gsub 删除电话号码中的非法字符

c# - .NET 正则表达式引擎未返回任何匹配项,但我期待 8

R 正则表达式 : removing only the immediate following character after >

javascript - 这个数字范围正则表达式可以重构吗?

python - 匹配具有特定字符串的行以提取值 Python Regex

python - 十六进制和其他一些字符串的正则表达式

python - 正则表达式匹配最后的模式