忽略花括号中的值

时间:2018-02-09 06:11:06

标签: c# .net regex regex-lookarounds

public static string ToKebabCase(this string value)
{
    if (string.IsNullOrEmpty(value))
        return value;

    return Regex.Replace(
                value,
                "(?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z])",
                "-$1",
                RegexOptions.Compiled)
            .Trim()
            .ToLower();
}

此方法生成字符串

"{branchId}/GetUser/{userId}" -> "{branch-id}/-get-user/{user-id}"

我需要:

 "{branchId}/get-user/{userId}"

如何忽略大括号中的值?

2 个答案:

答案 0 :(得分:1)

这只是“并非一切都必须用正则表达式来解决

的一个例子
public static string ToKebabCase(this string value)
{
   if (string.IsNullOrEmpty(value))
      return value;

   var list = value.Split('/');
   list[1] = Regex.Replace(list[1], "([A-Z])", "-$1").ToLower();

   return string.Join("/", list).Trim();
}

RegEx解决方案可能

public static string ToKebabCase(string value)
{
   if (string.IsNullOrEmpty(value))
      return value;

   return Regex.Replace(value, @"(?<!/)([A-Z])(?![^\{\}]*\})", "-$1").Trim()
}

内容如下

前面没有/

(?<!/)

大写字母

([A-Z])

不在括号内

(?![^\{\}]*\})

答案 1 :(得分:0)

也许您可以捕获第1组中的{branchId},第2组中的Get以及第3组中的User和第4组中的{userId}以获取示例字符串:

({[^}]+})(\/[A-Z][a-z]+)([A-Z][a-z]+\/)({[^}]+})

在替换中,您将使用$1$2-$3$4

public static string ToKebabCase(this string value)
{
    if (string.IsNullOrEmpty(value))
        return value;

    Regex r1 = new Regex(@"({[^}]+})(\/[A-Z][a-z]+)([A-Z][a-z]+\/)({[^}]+})");
    Match match = r1.Match(value);
    if (match.Success) {
        value = String.Format("{0}{1}-{2}{3}", 
            match.Groups[1].Value,
            match.Groups[2].Value.ToLower(),
            match.Groups[3].Value.ToLower(),
            match.Groups[4].Value
        );           
    }
    return value;
}

Demo output C#