正则表达式.骆驼案要强调.忽略第一次出现

Mik*_*Del 23 c# regex

例如:

thisIsMySample 
Run Code Online (Sandbox Code Playgroud)

应该:

this_Is_My_Sample
Run Code Online (Sandbox Code Playgroud)

我的代码:

System.Text.RegularExpressions.Regex.Replace(input, "([A-Z])", "_$0", System.Text.RegularExpressions.RegexOptions.Compiled);
Run Code Online (Sandbox Code Playgroud)

它工作正常,但如果输入更改为:

ThisIsMySample
Run Code Online (Sandbox Code Playgroud)

输出将是:

_This_Is_My_Sample
Run Code Online (Sandbox Code Playgroud)

如何才能忽略第一次出现?

sa_*_*213 41

非正则表达式解决方案

string result = string.Concat(input.Select((x,i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())); 
Run Code Online (Sandbox Code Playgroud)

似乎也很快:正则表达式:2569ms,C#:1489ms

Stopwatch stp = new Stopwatch();
stp.Start();
for (int i = 0; i < 1000000; i++)
{
    string input = "ThisIsMySample";
    string result = System.Text.RegularExpressions.Regex.Replace(input, "(?<=.)([A-Z])", "_$0",
            System.Text.RegularExpressions.RegexOptions.Compiled);
}
stp.Stop();
MessageBox.Show(stp.ElapsedMilliseconds.ToString());
// Result 2569ms

Stopwatch stp2 = new Stopwatch();
stp2.Start();
for (int i = 0; i < 1000000; i++)
{
    string input = "ThisIsMySample";
    string result = string.Concat(input.Select((x, j) => j > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString()));
}
stp2.Stop();
MessageBox.Show(stp2.ElapsedMilliseconds.ToString());
// Result: 1489ms
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 15

您可以使用lookbehind来确保每个匹配前面至少有一个字符:

System.Text.RegularExpressions.Regex.Replace(input, "(?<=.)([A-Z])", "_$0",
                      System.Text.RegularExpressions.RegexOptions.Compiled);
Run Code Online (Sandbox Code Playgroud)

lookaheads和lookbehinds允许您对匹配项周围的文本进行断言,而不在匹配项中包含该文本.