使用正则表达式在 c# 中使用字符转义字符串的一部分

Escape parts of string with a character in c# using regex

我有这样的字符串:

/one/two/three-four/five six seven/eight/nine ten eleven-twelve

我需要先用 spaces 替换破折号,然后能够用“#”符号转义任何包含 space 的词组,所以上面的字符串应该是:

/one/two/#three four#/#five six seven#/eight/#nine ten eleven twelve#

我有以下扩展方法,它适用于两个词,但我怎样才能让它适用于任意数量的词。

 public static string QueryEscape(this string str)
    {
        str = str.Replace("-", " ");
        return Regex.Replace(str, @"(\w*) (\w*)", new MatchEvaluator(EscapeMatch));
    }

private static string EscapeMatch(Match match)
    {
        return string.Format("#{0}#", match.Value);
    }

所以我想我真的需要帮助考虑到正确的正则表达式

  1. 可以有任意数量的 spaces
  2. 可能有也可能没有尾部斜杠(“/”)
  3. 考虑到单词在斜杠之间分组,上面的 #2 除外。
  4. 破折号是非法的,需要替换为 spaces

提前感谢您的支持。

这应该适合你:

public static string QueryEscape(this string str)
{
    return Regex.Replace(str.Replace("-", " "), @"[^/]*(\s[^/]*)+", "#$&#");
}

基本上,这个想法是匹配不是包含 (white-)space 字符的斜线的文本范围。然后在匹配项周围添加井号。