案例变更的正则表达式

时间:2011-07-26 14:16:31

标签: c# regex

我正在尝试获取一个字符串,以便在字符串中的大小写更改时使用下划线'_',以使用户更清楚。例如,如果我们有一个String'个人ID号码',我想把它变成'personal_ID_number'。这是在C#。

谢谢,我感谢任何帮助,建议。

-SID

2 个答案:

答案 0 :(得分:5)

替换案例更改
你正在寻找这个(我删除了ID之前的空格,假设它是一个错字)

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

它会将personalIDnumber转换为personal_ID_number

here on Regexr

Lookbehind((?<=[a-z]))和lookahead((?=[A-Z]))构造匹配小写字母和大写字母之间的空字符串(或者在管道{{之后的第二部分中相反的方向) 1}})并用下划线替换它。

使用可选空格替换案例更改
如果要在替换中包含空格,只需将其包含在外观

之间
|

它会将(?:(?<=[a-z])\s*(?=[A-Z]))|(?:(?<=[A-Z])\s*(?=[a-z])) 转换为personal IDnumber

请参阅此here on Regexr

替换案例更改,但每个字都以大写开头 如果你说每个单词都以大写字母开头,那么你可以这样做

personal_ID_number

这将来自

  

PersonalIDNumber
  JustAnotherTest
  OtherWordWithID
  SomeMORETest

  

Personal_ID_Number
  Just_Another_Test
  Other_Word_With_ID
  Some_MORE_Test

请参阅此here on Regexr

答案 1 :(得分:0)

非正则表达式解决方案(以防万一)

    string str = "personalIDnumber";
    var result =
        Enumerable.Range(0, str.Length - 1)
            .Where(i => char.IsUpper(str[i]) != char.IsUpper(str[i + 1]))
            .ToList();

    string resultString = result.Aggregate(str, (current, i) => current.Insert(i + 1 + result.IndexOf(i), "_"));

result存储了必须插入_并且Aggregate()函数插入的位置列表。