除某些模式外,如何将整个文本大写?

时间:2012-08-16 11:05:30

标签: c# regex

我有一个所有大写的文本(字符串),除了以下内容:

  1. 以:(冒号)
  2. 开头的单词
  3. 用双引号括起来的单词或字符串,“”
  4. 单引号包围的单词或字符串,''
  5. 其他所有内容都应该替换为大写字母,格式(空格,换行符等)应该保留。

    我如何使用Regex(C#样式/语法)进行此操作?

2 个答案:

答案 0 :(得分:4)

我认为你正在寻找这样的东西:

text = Regex.Replace(text, @":\w+|""[^""]*""|'[^']*'|(.)",
                     match => match.Groups[1].Success ?
                              match.Groups[1].Value.ToUpper() : match.Value);
  • :\w+ - 用冒号匹配单词。
  • "[^"]*"|'[^']*' - 匹配引用的文字。对于转义引号,您可以使用:

    "[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'
    
  • (.) - 捕获其他任何内容(您也可以尝试([^"':]*|.),它可能会更快)。

接下来,我们使用Regex.Replace的回调来做两件事:

  • 确定我们是否需要按原样保留文字,或
  • 返回文本的大写版本。

工作示例:http://ideone.com/ORFU8

答案 1 :(得分:1)

您可以从此RegEx开始:

\b(?<![:"'])(\w+?)(?!["'])\b

但当然,如果还不够,你必须自己改进它。 例如,这也找不到“dfgdfg”(不等于引号) 找到的单词是在第一场比赛($ 1)