【问题标题】:Regex "match up to" (in two cases)正则表达式“匹配”(在两种情况下)
【发布时间】:2014-10-21 17:10:17
【问题描述】:

我有以下正则表达式,它将在各种情况下捕获引号标签的开头和作者。

我无法让它与 link=pid= 匹配(注意每个前面的空格)。

目前,我认为正在发生的事情是表达式匹配单个字母,而不是上面的字符串。

\[(quote)\]?\s*(?:author)?=?(.[^link=|pid=]+[\w]*).*?\]

我正在测试正则表达式的字符串示例。我试图捕捉两件事:“报价”(成为我的 1 美元),然后是用户名(在各种情况下,成为我的 2 美元)。

替换为 [$1=$2]。

我试图在右方括号处停止表达式,因此我不必处理引号标记内容或最后的关闭标记。该表达式仅处理开头的引号标记和属性。

[quote='User Name' pid='1082654' dateline='1411779439']Test[/quote]

使用上面的正则表达式,它会匹配:

[quote='User Name' pid]Test[/quote]

当它应该匹配上面的所有内容时,除了“pid”。这是一个更完整的例子:http://regex101.com/r/iK2nO2/1

如何更清楚地定义捕获组应该停止的位置?我将它与 PHP 一起使用,所以我认为是 PCRE 风格。

【问题讨论】:

  • 预期的输出究竟是什么?
  • 由于方括号是用来分隔字符类的,写[^link=|pid=]这样的东西没有任何意义。
  • 子表达式[^link=|pid=]+ 匹配“link=|pid”之外的一个或多个连续字符。你实际上想匹配什么,除此之外,你想捕捉什么?
  • 预期的输出是 [quote='User Name']Test[/quote]
  • 当 'author' 属性存在时,你能依赖它成为第一个吗?另外,是否需要对标签格式进行全面验证?

标签: php regex pcre


【解决方案1】:
\[(quote)\]?\s*(?:author)?=?((?:(?!\s+link|\s+pid).)+).*?\]

试试这个。查看演示。

http://regex101.com/r/iK2nO2/3

【讨论】:

  • 非常感谢,这对我来说很好。有趣的是,您如何匹配该列表中的第二个($2 不仅仅是作者/用户名)。
猜你喜欢
  • 2011-08-11
  • 2013-12-13
  • 2021-07-13
  • 2018-03-18
  • 1970-01-01
  • 2014-09-05
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多