【问题标题】:Regex PCRE: Validate string to match first set of string instead of last正则表达式 PCRE:验证字符串以匹配第一组字符串而不是最后一组
【发布时间】:2014-01-02 00:46:46
【问题描述】:

我尝试了很多东西,但只要连续 2 次满足标准,我就会坚持使用正则表达式。在这种情况下,它只是将其视为一个表达式而不是 2 个。

\[ame\=[^\.]+(.+)youtube\.(.+)v\=([^\]\&\"]+)[\]\'\"\&](.+)\[\/ame\]

例如

[ame="http://www.youtube.com/watch?v=brfr5CD2qqY"][B][COLOR=yellow]http://www.youtube.com/watch?v=brfrx5D2qqY[/COLOR ][/B][/ame][/U] [B][COLOR=黄色]或[/COLOR][/B] [B][COLOR=黄色]B[/COLOR][/B] [ame="http://www.youtube.com/watch?v=M9ak3rKIBAU"][B][COLOR=yellow]http://www.youtube.com/watch?v=M9a3arKIBAU[/COLOR][/ B][/我] [B][COLOR=黄色]或[/COLOR][/B] [B][COLOR=黄色]C[/COLOR][/B] [ame="http://www.youtube.com/watch?v=7vh--3pyq5U"][COLOR=yellow]http://www.youtube.com/watch?v=7vh--3pyq5U[/COLOR ][/ame]

在这种情况下,此正则表达式不会匹配所有 3 个选项,而是将其视为一个。

任何想法如何制作一个匹配第一个 "[/ame]" 的表达式?

【问题讨论】:

  • 欢迎来到 SO!始终尝试简化您的示例,使它们更小且更易于理解。还要让你更清楚你得到什么以及你实际得到什么。在这种情况下,如果您将每个 + 都设为非贪婪 +? 是否不能解决您的问题?

标签: regex pcre regex-negation regex-lookarounds regex-greedy


【解决方案1】:

问题在于.+ 的使用——它们是“贪婪的”,这意味着它们会消耗尽可能多的输入并且仍然匹配。

将它们更改为不情愿量词:.+?,如果最后一个匹配,则不会向前跳过第一个匹配的结尾以匹配结尾。

【讨论】:

  • 谢谢,我认为您的意思是句号而不是逗号,但我认为我可以使用它。问题是,即使使用不情愿的量词,我在末尾使用了 s 修饰符,这仍然导致它匹配整个字符串,而不是在第一个 ame 处停止]。
【解决方案2】:

我不确定你的目标是什么(你还没有说清楚)

但这会为您匹配并捕获 youtube URL,确保您仅匹配 [ame=[/ame] 之间的每个实例

/\[ame=["'](.*?)["'](.*?)\/ame\]/i

这是一个有效的示例,以及一个可以在其中玩耍的出色沙盒:http://regex101.com/r/jR4lK2

【讨论】:

  • 谢谢,使用了我的原始示例,但使用了您的“.*?”。您的示例包含许多非 youtube 网址,但对我来说效果不佳。此外,用于测试的好正则表达式网站!
  • 是的,不确定你想捕捉什么,最大的部分肯定是非贪婪的.*?。正则表达式 101 太棒了!祝你好运
  • 其实试试这个:\[ame=["'](.*?youtu\.?be.*?)["'](.*?)\/ame\] 只匹配 youtube 和 youtu.be
  • be 之前的“./”是一个很好的建议,我肯定将它添加到我的正则表达式中。顺便说一句,计划(我一开始没有很好地解释)是转换:
  • [ame=(可以有", www, https:// 或者可能没有)youtube.com/watch?v=] 之外的大多数其他字符(除了 / 之外几乎任何字符都可以放在此处)[/ame] 然后我将其转换为:[media=youtube][/media]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多