【问题标题】:How to negate filename after a specific term in a regex如何在正则表达式中的特定术语后否定文件名
【发布时间】:2021-02-04 12:50:39
【问题描述】:

我有一个检测网址的正则表达式:

 @"((http|ftp|https)\:\/\/)?([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?";

我将它与 regex.replace 一起使用以从文本中删除 url。

我不希望它替换任何以 /images 开头的单词

例如,如果文本是“这是我的文本,这里是一个链接 http://dfdf.com,我的是 /images/dd.gif” 我需要 http://dfdf.com 替换但不需要 /images/dd.gif

我的正则表达式替换了 dd.gif 所以我想否定图像之后的任何单词/

知道如何解决这个问题吗?

【问题讨论】:

  • http://dfdf.com/images/dd.gif 应该怎么办?
  • 试试(?<!\S)(?:(?:https?|ftps?)://)?([\w-]+(?:\.[\w-]+)+)([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?。注意\w 匹配_,所以[\w_] = \w
  • 或者,\b(?<!\bimages/)(?:(?:https?|ftps?)://)?([\w-]+(?:\.[\w-]+)+)([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])??见this regex demo
  • 你不需要转义 :/,除非你想让你的正则表达式更不可读。

标签: c# regex


【解决方案1】:

您可以在单词边界之后开始匹配,如果它前面紧跟一个完整的“单词”images/,则匹配失败

\b(?<!\bimages/)(?:(?:http|ftp)s?://)?([\w-]+(?:\.[\w-]+)+)([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

请参阅regex demo详情

  • \b - 单词边界
  • (?&lt;!\bimages/) - 没有images/,因为整个单词都可以直接放在左边
  • (?:(?:http|ftp)s?://)? - httpftp 的可选序列,后跟可选的 s,然后是 :// 子字符串
  • ([\w-]+(?:\.[\w-]+)+) - 第 1 组:一个或多个单词或连字符,后跟一个或多个 . 序列,然后是一个或多个单词或连字符
  • ([\w.,@?^=%&amp;:/~+#-]*[\w@?^=%&amp;/~+#-])? - 可选的第 2 组:零个或多个单词字符或来自 .,@?^=%&amp;:/~+#- 集合的字符,然后是一个单词字符或来自 @?^=%&amp;/~+#- 集合的字符。

【讨论】:

  • 谢谢,我使用了你的解决方案,效果很好。
【解决方案2】:

作为替代解决方案,您可以匹配您不想删除的内容并捕获您想要删除的内容。

您可以使用带有Replace 的回调并测试组1 的存在。如果存在,则返回一个空字符串。如果不存在,则返回匹配项以使其保持不变。

\S*/images\S*|(?<!\S)((?:(?:https?|ftp)://)?[\w-]+(?:(?:\.[\w-]+)+)(?:[\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?)

说明

  • \S*/images\S* 匹配 /images 前后是您想要保留的可选非空白字符
  • |或者
  • (?&lt;!\S) 向左声明空白边界
  • ((?:(?:https?|ftp)://)?[\w-]+(?:(?:\.[\w-]+)+)(?:[\w.,@?^=%&amp;:/~+#-]*[\w@?^=%&amp;/~+#-])?) 你尝试的模式做了一些小的改动,让它更短

Regex demo (点击表格标签查看匹配项)

例如

var s = @"this is my text here is a link http://dfdf.com and my is /images/dd.gif";
var regex = new Regex(@"\S*/images\S*|(?<!\S)((?:(?:https?|ftp)://)?[\w-]+(?:(?:\.[\w-]+)+)(?:[\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?)");
var result = regex.Replace(s, match => match.Groups[1].Success ? "" : match.Value);
Console.WriteLine(result);

查看C# demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2020-04-20
    • 2016-08-09
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多