使用正则表达式解析 URL,在 Markdown 中忽略代码块和代码片段

3

我目前在我的C# / .NET Core应用程序中使用这个正则表达式来从一个Markdown文件中解析HTTP、HTTPS和FTP URL:

static readonly Regex _urlRegex = new Regex(@"(((http|ftp|https):\/\/)+[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?)");

void UpdateGitHubReadme(string gitHubRepositoryName, string gitHubReadmeText)
{
    var updatedMarkdown = _urlRegex.Replace(gitHubReadmeText, x => HandleRegex(x.Groups[0].Value, gitHubRepositoryName.Replace(".", "").Replace("-", "").ToLower(), "github", gitHubUser.Alias));

    //handle updated markdown
}

static string HandleRegex(in string url, in string repositoryName, in string channel, in string alias)
{
    //handle url
}

我希望更新这个正则表达式,以便忽略markdown代码块和代码片段内部的URL。

示例1

以下URL应该被忽略,因为它在一个代码块中:

` ` `
{ "name": "Brandon", "blog" : "https://codetraveler.io" }

` ` `

示例2

以下URL应该被忽略,因为它在代码片段中:

`curl -I https://www.keycdn.com `


正则表达式在C#中使用吗?你是要替换文本吗? - Wiktor Stribiżew
是的,正则表达式正在C#中使用。我会编辑问题以包括这一点。我也是一个正则表达式新手 - 如果你不介意我问一下 - C#如何影响这个正则表达式? - Brandon Minnick
.NET正则表达式没有像PCRE中的(*SKIP)(*F)一样跳过(“忽略”)匹配的功能。您需要使用代码。 - Wiktor Stribiżew
好的,我会在问题中添加C#代码。 - Brandon Minnick
不要转义“/”,它们不是任何特殊的正则表达式元字符。过度转义不是一个好习惯。“;”也匹配“;”,但没有理由这样做。 - Wiktor Stribiżew
哦,好的,知道了!对于我的编辑和假设它只是一个打字错误,我很抱歉。 - Brandon Minnick
1个回答

2
你可以利用已经有匹配评估器作为替换参数的现有代码来实现。在当前的正则表达式中,你需要添加另一种选择 (使用 | 选项符),以匹配你希望忽略的匹配上下文,然后检查哪个组匹配。你应该添加的选择是 "(?
- "(?
请参考以下示例代码:
static readonly Regex _urlRegex = new Regex(@"(?<!`)(`(?:`{2})?)(?:(?!\1).)*?\1|((?:ht|f)tps?://[\w-]+(?>\.[\w-]+)+(?:[\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?)", RegexOptions.Singleline);

void UpdateGitHubReadme(string gitHubRepositoryName, string gitHubReadmeText)
{
    var updatedMarkdown = _urlRegex.Replace(gitHubReadmeText, x => x.Groups[2].Success ?
         HandleRegex(x.Groups[0].Value, gitHubRepositoryName.Replace(".", "").Replace("-", "").ToLower(), "github", gitHubUser.Alias) : x.Value);

    //handle updated markdown
}

我稍微修改了URL模式,使其更加简洁高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接