【问题标题】:RegEx: Matching Pattern within Pattern - I think I need to use Positive Lookbehinds?正则表达式:模式中的匹配模式 - 我想我需要使用积极的 Lookbehinds?
【发布时间】:2011-02-01 00:10:36
【问题描述】:

我正在尝试使用 RegEx 在模式中查找模式。具体来说,我想要做的是将 URL 捕获到引用中,并在其中搜索最后一个 = 符号之后的所有内容并捕获它。

所以给定这个字符串

<a href="http://my.domain.com/?s_cid=EM&s_ev9=CMC21892&s_ev10=EM_CMC21892_LC_stuff" style="color: #365EBF:">stuff</a>

我最初会找到

href="http://my.domain.com/?s_cid=EM&s_ev9=CMC21892&s_ev10=EM_CMC21892_LC_stuff"

使用这个正则表达式:href="(https?[^"]*)"

从那里我可以解析实际的字符串(当查看捕获的组时)我正在寻找EM_CMC21892_LC_stuff=[^"=]*$

当我尝试将两者结合起来在一个 RegEx 中完成时,我没有成功。

有什么想法吗?

【问题讨论】:

  • 这里为什么要使用正则表达式?你使用的语言没有HTML解析库或者URL解析库吗?
  • 嗯,我正在尝试使用正则表达式变得更好,所以我想看看它是否可能。其他原因是我不确定该语言(RealStudio)是否有一个可以处理的解析库。这是对我过去所做工作的更新,我根据其他因素和找到的模式做了一堆奇怪的查找/替换,当时 RegEx 是我最好的选择。
  • 是的,当然有可能。一切皆有可能,但并非一切都是权宜之计。
  • 要同时显示可能但又不符合权宜之计的内容,请阅读this testament against (mortals’:) using regexes on HTML。如果你很好地理解了这个例子,那么像parsing email addresses per RFC 5322 这样的简单任务肯定会轻而易举。 提示: 模式匹配的内容比大多数人一天能学会的要多得多。

标签: regex lookbehind


【解决方案1】:

他说得对,使用正则表达式解析 HTML 就是自找麻烦。

也就是说,试试href="http[^"]+=([^"]+?)"

【讨论】:

  • 不,不是自找麻烦:要求认真教育。 ☺
【解决方案2】:

我同意 Mark Byer 关于使用现有的 html/url 解析函数而不是正则表达式的评论(尽管您没有指定您使用的是哪种语言,所以我们无法真正帮助...)

但是,如果你坚持使用正则表达式的方式,这里有一个模式:

/href="([^"]*=([^"]*))"/

编辑添加:这是结果的样子,不确定您是否仍要捕获完整的 url 或仅捕获最后一个参数值,但此模式捕获两者:

Array
(
    [0] => Array
        (
            [0] => href="http://my.domain.com/?s_cid=EM&s_ev9=CMC21892&s_ev10=EM_CMC21892_LC_stuff"
        )

    [1] => Array
        (
            [0] => http://my.domain.com/?s_cid=EM&s_ev9=CMC21892&s_ev10=EM_CMC21892_LC_stuff
        )

    [2] => Array
        (
            [0] => EM_CMC21892_LC_stuff
        )

)

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多