【问题标题】:C# Regex, match but not include the first character before matched stringC#正则表达式,匹配但不包括匹配字符串之前的第一个字符
【发布时间】:2017-02-13 12:41:38
【问题描述】:

如何使这个 C# 正则表达式在匹配结果中不包含 URL 之前的第一个字符:

((?!\").)https?:\/\/twitter\.com\/(?:#!\/)?(\w+)\/status(?:es)?\/(\d+)

这将匹配:

Xhttps://twitter.com/oppomobileindia/status/798397636780953600

注意第一个 X 字母。

我希望它匹配不带双引号的 URL。对于那些不以双引号开头的 URL,也不要在 https 之前包含第一个字符。

我在代码中使用的一个实际示例:

 var str = "<div id=\"content\">
             <p>https://twitter.com/oppomobileindia/status/798397636780953600</p>
             <p>\"https://twitter.com/oppomobileindia/status/11111111111111111111</p></div>";

 var pattern = @"(?<!""')https?://twitter\.com/(?:#!/)?(\w+)/status(?:es)?/(\d+)";//

var rgx = new Regex(pattern);

var results = rgx.Replace(str, "XXX");

在上面的例子中,只有第一个 URL 应该被替换,因为第二个 URL 在 URL 之前有双引号。它也应该在完全匹配时被替换,在匹配字符串之前没有第一个字母。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    使用(?&lt;!") 否定后视:

    var re = @"(?<!"")https?://twitter\.com/(?:#!/)?(\w+)/status(?:es)?/(\d+)";
    

    (?&lt;!") 表示在当前位置之前不能有"

    在 C# 中,您无需在模式内转义 /,因为在定义正则表达式时不使用正则表达式分隔符。

    注意 C# 语法:如果要在逐字字符串文字中定义 ",请将其加倍。在常规字符串文字中,转义 "\

    var re = "(?<!\")https?://twitter\\.com/(?:#!/)?(\\w+)/status(?:es)?/(\\d+)";
    

    【讨论】:

    • 它确实匹配前面有双引号的 URL。我在regexstorm.net/tester 上检查了它,并使用我的正则表达式替换功能,它不会阻止带有双引号的 URL 在被替换之前。稍后我将添加一个示例。
    • 我已经用我想要实现的目标更新了这个问题。 1) 匹配前面没有第一个字符的 URL。 2) 不要匹配以双引号开头的 URL。感谢 Wiktor 帮助我。
    • 我发布了确切的逐字字符串文字。我添加了关于正则表达式用法的注释。
    猜你喜欢
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多