我有一个我想要的全部大写的文本(字符串),但以下内容除外:
- 以:(冒号)开头的词
- 用双引号括起来的单词或字符串,“”
- 用单引号括起来的单词或字符串,''
其他所有内容都应替换为其大写对应项,并且应保留格式(空格、换行符等)。
我将如何使用正则表达式(C# 样式/语法)来执行此操作?
我想你正在寻找这样的东西:
text = Regex.Replace(text, @":\w+|""[^""]*""|'[^']*'|(.)",
match => match.Groups[1].Success ?
match.Groups[1].Value.ToUpper() : match.Value);
:\w+
- 用冒号匹配单词。"[^"]*"|'[^']*'
- 匹配引用的文本。对于转义引号,您可以使用:
"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'
(.)
- 捕捉其他任何东西(你也可以尝试([^"':]*|.)
,它可能会更快)。
接下来,我们使用Regex.Replace的回调来做两件事:
工作示例:http: //ideone.com/ORFU8
你可以从这个 RegEx 开始:
\b(?<![:"'])(\w+?)(?!["'])\b
当然,如果还不够的话,你必须自己改进它。例如,这也不会找到“dfgdfg”(不等引号)找到的单词在第一个匹配项中($1)