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}"
如何忽略大括号中的值?
答案 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;
}