C# - 将每个大写字母替换为下划线和该字母

19

如何在 C# 中将每个大写字母替换为下划线和该字母?注意:除非该字符已经由下划线处理过。

更新: 例如, MikeJones
会被转换为
Mike_Jones

但 Mike_Jones
不会被转换为
Mike__Jones

使用正则表达式是最好的方法吗?我该从哪里开始?


你能编辑你的问题并提供一个例子吗?比如说,字符串看起来像这样,但是在我想要的操作之后会变成什么样子? - ahsteele
6个回答

37

正则表达式听起来最好:

string input = "Test_StringForYou";
string replaced = Regex.Replace(input, @"(?<!_)([A-Z])", "_$1");
Console.WriteLine(replaced);

输出: _Test_String_For_You

请确保添加 using System.Text.RegularExpressions;


+1 - 有没有办法修改正则表达式,使第一个字母前面没有下划线? - BuddyJoe
6
@tyndall: (?<!_|^)([A-Z]) 或者 (?<=[a-z])([A-Z]) 应该可以解决这个问题。 - Alan Moore
反向操作怎么样? - Avlin

3

所以你不想改变字母的大小写!我知道你没有说你想改变,但是我们中的一些人会因为这个问题经常出现而假设它。在这种情况下,这个正则表达式就是你需要的:

s = Regex.Replace(s, @"(?<=[a-z])([A-Z])", @"_$1");

进行小写字母的正向先行断言也可以确保您不会在字符串开头添加下划线。


1
Regex.Replace(subject, "([A-Z])", "_$1");

将“The Quick Brown Fox”更改为“_The _Quick _Brown _Fox”

这是您需要的吗?


0

不知道这是否仍然相关,但以下是一种简单的方法。

private string StripInput(string input)
    {
        var output = input
            .Replace(" ", "_")
            .ToLower().Trim();
        return output;
    }

string TEST = "Hello World";
    litTest.Text = StripInput(TEST);

将会输出为:hello_world


2
这并不是将每个大写字母都替换为下划线和该字母。它会将空格替换为下划线,并将所有内容转换为小写。 - Klaus Byskov Pedersen

0
using System.Text.RegularExpressions;

//-----------------------------------------------------------------

string str = Regex.Replace("MyString", @"([A-Z])", " $1").Trim();

//-----------------------------------------------------------------

str givs "My String"

它运行得很好


0

如果您想将此内容转换为:

示例文本

变成

_sample _text

那么,正则表达式并不能严格实现这一点,因为您无法在替换表达式中转换捕获或组。当然,您可以使用Jake的答案并在末尾添加.ToLower()调用,这将用小写字母替换所有大写字母。

如果您只想在每个没有下划线的大写字母前加上下划线,则仅使用Jake的答案即可完成。


2
错误。您可以访问(http://msdn.microsoft.com/en-us/library/cft8645c%28VS.80%29.aspx)。 - kennytm
1
@Kenny:这并没有错,因为正则表达式语法不允许进行转换。在这种情况下,API可以实现,但语法本身不行。对于这个例子,我认为调用 ToLower() 可能会导致更清晰、更简单的代码。 - Adam Robinson
那么正则表达式语法也不允许替换。但我同意在这种情况下扫描字符串并使用.ToLower()比使用正则表达式更好。 - kennytm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接