正则表达式,用大写字母拆分字符串但忽略TLA

时间:2009-07-08 12:58:23

标签: .net regex

我正在使用正则表达式

System.Text.RegularExpressions.Regex.Replace(stringToSplit, "([A-Z])", " $1").Trim()

以大写字母分割字符串,例如:

'MyNameIsSimon'变为'我的名字是西蒙'

我在使用枚举时发现这非常有用。我想要做的是稍微更改它,以便只有当 next 字母是小写字母时才会拆分字符串,例如:

'USAToday'将成为'今日美国'

可以这样做吗?

编辑:感谢大家的回应。我可能没有完全想到这一点,在某些情况下'A'和'I'需要被忽略,但这是不可能的(至少不是有意义的)。在我的情况下,虽然下面的答案做我需要的。谢谢!

7 个答案:

答案 0 :(得分:43)

((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))

或其支持Unicode的表兄

((?<=\p{Ll})\p{Lu}|\p{Lu}(?=\p{Ll}))

全局替换为

" $1"

手柄

TodayILiveInTheUSAWithSimon
USAToday
IAmSOOOBored

产生

 Today I Live In The USA With Simon
USA Today
I Am SOOO Bored

在第二步中你必须修剪弦乐。

答案 1 :(得分:12)

任何未跟随大写字符的大写字符:

Replace(string, "([A-Z])(?![A-Z])", " $1")

修改

我刚注意到你正在使用它进行枚举。我真的不鼓励使用像这样的枚举的字符串表示,并且手头的问题是一个很好的理由。看看这个: http://www.refactoring.com/catalog/replaceTypeCodeWithClass.html

答案 2 :(得分:1)

您可能会考虑更改枚举; MS编码指南建议Pascal套管缩写,好像它们是单词; XmlDocumentHtmlWriter等。但是,双字母的丙烯酸不遵循此规则; System.IO

所以你应该使用UsaToday,你的问题就会消失。

答案 3 :(得分:1)

我希望这可以帮助您将字符串拆分为大写字母等等。您可以尝试使用 Humanizer ,这是一个免费的nuget包。这将使您在使用多种语言的字母,句子,数字,数量等方面遇到更多麻烦。 请访问:https://www.nuget.org/packages/Humanizer/

答案 4 :(得分:0)

Tomalak的表达对我有用,但不适用于内置的Replace函数。但是,Regex.Replace()确实有效。

For i As Integer = 0 To names.Length - 1
  'Worked
  names(i) = Regex.Replace(names(i), "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1").TrimStart()

  ' Didn't work
  'names(i) = Replace(names(i), "([A-Z])(?=[a-z])|(?<=[a-z])([A-Z])", " $1").TrimStart()
Next

顺便说一句,我正在使用它来分割枚举名称中的单词,以便在UI中显示,并且它的工作非常精彩。

答案 5 :(得分:0)

注意:我没有读好这个问题,USAToday将返回“今天”;所以这个anwser不是正确的。

    public static List<string> SplitOnCamelCase(string text)
    {
        List<string> list = new List<string> ();
        Regex regex = new Regex(@"(\p{Lu}\p{Ll}+)");
        foreach (Match match in regex.Matches(text))
        {
            list.Add (match.Value);
        }
        return list;
    }

这会将“WakeOnBoot”与“Wake On Boot”匹配,并且不会在NMI或TLA上返回任何内容

答案 6 :(得分:0)

我的版本也处理简单​​的算术表达式:

private string InjectSpaces(string s)
{
    var patterns = new string[] {
        @"(?<=[^A-Z,&])[A-Z]",          // match capital preceded by any non-capital except ampersand
        @"(?<=[A-Z])[A-Z](?=[a-z])",    // match capital preceded by capital and followed by lowercase letter
        @"[\+\-\*\/\=]",                // match arithmetic operators
        @"(?<=[\+\-\*\/\=])[0-9,\(]"    // match 0-9 or open paren preceded by arithmetic operator
    };
    var pattern = $"({string.Join("|", patterns)})";
    return Regex.Replace(s, pattern, " $1");
}