首页 > 解决方案 > 匹配给定文本字符串中“a”链接的 atlassian wiki 标记

问题描述

我需要帮助创建 ac# 正则表达式模式,该模式将从字符串中查找“a”链接标记。

这是一个示例输入文本: string text = "some line of text with random [ in the line. [http://example.com] [link title|http://example.com]";

我无法让它在[http://example.com]or上匹配[link title|http://example.com]

我尝试了许多失败的模式,这里只是最后两个:

@"\[(?<innerHtml>[.^\]]+)\|(?<href>[.^\]]+)\]\s"
@"\[(?<innerHtml>[^[]+.+)\]"

它们中的大多数返回匹配项,如“字符串文本”所示。

in the line. [http://example.com] [link title|http://example.com

眼镜:

标记 代替
[href] @"<a href=""${href}"">${href}</a>"
[innerHtml|href] @"<a href=""${href}"">${innerHtml}</a>"

标签: c#regex

解决方案


几点注意事项:

  • 要使用否定字符类,该^字符必须紧跟在左括号之后(即,[^...]。否则,它被视为文字字符。

  • 为了匹配没有标题的链接,第一部分需要是可选的。

您可以使用以下模式:

\[(?:(?<innerHtml>[^[|\]]+)\|)?(?<href>[^[\]]+)\]

演示

分解:

  • \[[-从字面上匹配字符。
  • (?:- 非捕获组的开始。
    • (?<innerHtml>- 第一个命名组的开始。
      • [^[|\]]+[- 一个否定类,用于匹配除、|和之外的多个字符]
    • )- 关闭命名组。
    • \||-从字面上匹配字符。
  • )- 关闭非捕获组。
  • ?- 表示上一组是可选的。
  • (?<href>[^[\]]+)[- 匹配除and以外的一个或多个字符,]并将它们捕获到第二个命名组中。
  • \]]-从字面上匹配字符。

推荐阅读