【问题标题】:Replace a specified string within a string which matches the regex pattern c#替换与正则表达式模式匹配的字符串中的指定字符串c#
【发布时间】:2018-03-06 11:18:39
【问题描述】:

我有一个包含以下字符串 URL 的多行文本框:

http://foodfacts.ambigouos.com
http://articles.ambigouos.com
http://www.dirtshirt.org

我想用正则表达式替换/更新上述 URL 中的字符串 http to https,其中 ambigouos.com 作为域。

预期输出:

https://foodfacts.ambigouos.com
https://articles.ambigouos.com
http://www.dirtshirt.org

以下代码已尝试但无法正常工作:

multilinebox.text = Regex.Replace(multilinebox.text, @"^http?://[a-zA-Z]*(\.ambigouos\.com)$", "$1", RegexOptions.IgnoreCase);

提前致谢。

【问题讨论】:

  • Below code tried but not working具体来说是怎么回事?
  • 你能定义not working吗?
  • 您知道您的正则表达式匹配http://htt://,对吧?
  • 您可能不需要正则表达式,只需检查行 .Contains("ambigouos.com") 然后执行 .Replace("http://", "https://")
  • @trailmax 如果只有 OP 不想确保仅更改 HTTP 链接,则这是真的。

标签: c# regex replace pattern-matching regex-group


【解决方案1】:

您可以利用字符串位于 开头的事实(即您应该使用RegexOptions.Multiline 标志编译正则表达式),您不需要检查结尾字符串/行在这里。此外,您需要围绕字符串的整个非固定部分设置分组结构。

如果您只需要在行首处理匹配项,请使用

Regex.Replace(multilinebox.text, @"^http://((?:[^/]*\.)?ambigouos\.com)", "https://$1", 
     RegexOptions.IgnoreCase | RegexOptions.Multiline);

如果您想在字符串中处理匹配任何地方,请删除 ^| RegexOptions.Multiline 使用

Regex.Replace(multilinebox.text, 
          @"http://((?:[^/]*\.)?ambigouos\.com)", 
          "https://$1", 
          RegexOptions.IgnoreCase);

请参阅regex demo

细节

  • ^ - 行首(因为使用了RegexOptions.Multiline
  • http:// - 文字子串
  • ((?:[^/]*\.)?ambigouos\.com) - 捕获组 1:
    • (?:[^/]*\.)? - 除/ 之外的任何0+ 字符的可选序列,然后是.
    • ambigouos\.com - 文字子串。

您可以将\r\n 添加到否定字符类以避免跨行溢出,即[^/] => [^/\r\n]

【讨论】:

  • http://foodfacts.ambigouos.com/ 与上述正则表达式不匹配,因此不替换为https://foodfacts.ambigouos.com/ 建议!!
  • @PPB It does, look here。这里是a C# demo
  • @PPB 你的意思是说你不需要在行首匹配这些 URL,而是在字符串中的任何地方匹配?
  • @PPB 但这意味着您想在行首匹配http://。无需删除 ^ 行首锚点。您是否添加了RegexOptions.Multiline 选项?显示您在 IDEONE 的确切代码。
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
相关资源
最近更新 更多