代码之家  ›  专栏  ›  技术社区  ›  Tlink

正则表达式从</a> 诸如此类

  •  0
  • Tlink  · 技术社区  · 7 年前

    我尝试了在SOF中找到的答案,但在这里没有得到支持: https://regexr.com 我基本上有一个。包含大量播客和描述的OPML文件。 格式如下:

    <outline text="Software Engineering Daily" type="rss" xmlUrl="http://softwareengineeringdaily.com/feed/podcast/" htmlUrl="http://softwareengineeringdaily.com" />
    

    我可以使用什么正则表达式来获取标题和链接:

    软件工程日报

    http://softwareengineeringdaily.com/feed/podcast/

    2 回复  |  直到 7 年前
        1
  •  1
  •   ctwheels    7 年前

    简明的

    有很多方法可以做到这一点。最好的方法可能是使用XML解析器。我一定会读的 this post 这讨论了正则表达式的使用,特别是在XML中。

    正如你所见,你的问题有很多答案。这还取决于您使用的语言,因为正则表达式引擎不同。一些人接受反向引用,而其他人则不接受。我将在下面发布多种方法,这些方法在不同的情况下/针对不同的regex口味。您可能可以从下面的多个正则表达式方法中拼凑出最适合您的部分。


    密码

    方法1

    这种方法几乎适用于任何正则表达式风味(至少是正常风味)。

    该方法仅检查属性值的开始和结束标记 " 并且不包括在 = 象征这是获得所需值的最简单解决方案。

    See regex in use here

    \b(text|xmlUrl)="[^"]*"
    

    类似地,以下方法添加了更多 价值 到上述表达式

    \b(text|xmlUrl)\s*=\s*"[^"]*"          Allows whitespace around =
    \b(text|xmlUrl)=(?:"[^"]*"|'[^']*')    Allows for ' to be used as attribute value delimiter
    

    另一种选择是(在我回答下面的评论之后),如果你想抓住每个属性 除了 具体来说,你可以使用以下方法。注意,我使用 \w ,它应该覆盖大多数属性,但您可以用您想要的任何有效字符替换它。 \S 可以用于指定任何非空白字符或一组字符,例如 [\w-] 可用于指定任何单词或连字符。特定属性的否定与 (?!text|xmlUrl) ,表示与这些字符不匹配。此外,请注意单词边界 \b 首先确保我们匹配的是 text 而不是具有相同终止的其他属性的可能性,例如 subtext .

    \b((?!text|xmlUrl)\w+)="[^"]*"
    

    方法2

    这种方法只适用于允许反向引用的正则表达式。显然,JGsoft应用程序、Delphi、Perl、Python、Ruby、PHP、R、Boost和Tcl支持单位数反向引用。JGsoft应用程序、Delphi、Python和Boost支持两位数的反向引用。信息依据 this article about numbered backreferences from Regular-Expressions.info

    See regex in use here

    该方法使用反向引用来确保在属性值的开始和结束处使用相同的结束标记,并且还包括在 = 象征这不允许属性没有指定分隔符(使用 xmlUrl=http://softwareengineeringdaily.com/feed/podcast/ 也可能有效)。

    See regex in use here

    \b(text|xmlUrl)\s*=\s*(["'])(.*?)\2
    

    方法3

    此方法与 方法2 但也允许不带分隔符的属性(请注意,分隔符现在被视为空格字符,因此,它将只匹配到下一个空格)。

    See regex in use here

    \b(text|xmlUrl)\s*=\s*(?:(["'])(.*?)\2|(\S*))
    

    方法4

    虽然 方法3 如果成功,一些人可能会抱怨属性值可能是两个组中的任何一个。这可以通过以下任一方法解决。

    方法4。A.

    分支重置组仅在少数语言中可用,特别是JGsoft V2、PCRE 7.2+、PHP、Delphi、R(启用PCRE)、Boost 1.42+ Regular-Expressions.info

    这还显示了如果不可能反向引用并且希望匹配多个分隔符,则将使用的方法( "([^"])"|'([^']*) )

    See regex in use here

    \b(text|xmlUrl)\s*=\s*(?|"([^"]*)"|'([^']*)'|(\S*))
    

    方法4。B

    通常不支持重复的子模式。看见 this Regular-Expresions.info article 有关更多信息

    此方法使用 J 正则表达式标志,允许重复的子模式名称( (?<v>) 在那里两次)

    See regex in use here

    \b(text|xmlUrl)\s*=\s*(?:(["'])(?<v>.*?)\2|(?<v>\S*))
    

    后果

    输入

    <outline text="Software Engineering Daily" type="rss" xmlUrl="http://softwareengineeringdaily.com/feed/podcast/" htmlUrl="http://softwareengineeringdaily.com" />
    

    输出

    下面的每一行代表一个不同的组。新的匹配项由两行分隔。

    text
    Software Engineering Daily
    
    xmlUrl
    http://softwareengineeringdaily.com/feed/podcast/
    

    解释

    我将解释中使用的正则表达式的不同部分 密码 这样您就可以理解这些部分的用法。这更多地是对上述方法的参考。

    • "[^"]*" " 符号。请注意 没有 检查是否有漏掉的反斜杠,它将匹配任何非- " 介于两者之间的字符 " . 同时 "(.*?)" 也可以使用,速度稍慢
    • (["'])(.*?)\2 基本上是 "(.*?)"|'(.*?)' . 您可以使用以下任何方法获得相同的结果:
      • (?:"(.*?)"|'(.*?)')
      • (?:"([^"])"|'([^']*)') <--略快于上面的线
    • (?|) 这是一个分支重置组。当你在其中放置组时,就像 (?|(x)|(y)) 它为两个匹配返回相同的组索引。这意味着如果 x 被捕获时,它将得到1的组索引,如果 y 如果被捕获,它还将获得1的组索引。
        2
  •  1
  •   Jan    7 年前

    对于 易于理解的 HTML 你可能会相处得很好的字符串

    Url=(['"])(.+?)\1
    

    来,大家一起 $2 看见 a demo on regex101.com .
    强制性:考虑改用解析器(请参见 here ).