例如:
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允许您对匹配项周围的文本进行断言,而不在匹配项中包含该文本.
归档时间: |
|
查看次数: |
11895 次 |
最近记录: |