0

我有一个我想要的全部大写的文本(字符串),但以下内容除外:

  1. 以:(冒号)开头的词
  2. 用双引号括起来的单词或字符串,“”
  3. 用单引号括起来的单词或字符串,''

其他所有内容都应替换为其大写对应项,并且应保留格式(空格、换行符等)。

我将如何使用正则表达式(C# 样式/语法)来执行此操作?

4

2 回答 2

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

于 2012-08-16T11:12:18.657 回答
1

你可以从这个 RegEx 开始:

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

当然,如果还不够的话,你必须自己改进它。例如,这也不会找到“dfgdfg”(不等引号)找到的单词在第一个匹配项中($1)

于 2012-08-16T11:13:52.023 回答