c# - C# 替换字符串的部分内容

标签 c# regex string

我有一系列看起来像“WORD1: JUNK1 WORD2: JUNK2”的字符串,我想从字符串中删除垃圾,同时保留单词之间的字符数(包括垃圾占用的字符数)。

  • 我有一个将使用的单词列表,但不是垃圾单词
  • 每行的单词、空格数和垃圾都会发生变化

到目前为止,我一直在使用像 (word|word|word)(.\*)(word|word|word)(.*) 这样的正则表达式,但我不知道如何以这种方式保持格式。

已编辑

抱歉,您是对的,WORD1/WORD2 和 JUNK1/JUNK2 是我所看到的实际值的变量。它全部是字母数字字符和斜杠。

输入示例:

“类别:(4 个空格)侧面(3 个空格)创建日期:(3 个空格)03/12/16”

“产品:(6 个空格)胡萝卜(4 个空格)删除日期:(4 个空格)05/11/17”

输出示例:

“类别:(12 个空格)创建日期:(11 个空格)”

“产品:(17 个空格)删除日期:(12 个空格”

我正在尝试用空格替换“SIDES”和“03/12/16”一词。相反,我希望 CATEGORY 和 DATE CREATED 之间的字符数保持不变,并且全部为空格。

最佳答案

我建议一个基于 Regex.Split 操作的解决方案:

var s = "CATEGORY:    SIDES   DATE CREATED:   03/12/16";
var rx = @"(\b(?:CATEGORY|PRODUCT|DATE (?:CREA|DELE)TED):)";
var chunks = Regex.Split(s, rx);
Console.WriteLine(string.Concat(
    chunks.Select(
        x => Regex.IsMatch(x, $"^{rx}$") ? x : new String(' ', x.Length))
    )
);

请参阅C# demo

(\b(?:CATEGORY|PRODUCT|DATE (?:CREA|DELE)TED):) 正则表达式是捕获组内的分隔符模式,因此 Regex.Split 可以将匹配添加到结果数组中。它匹配整个单词 CATEGORYPRODUCTDATE CREATEDDATE DELETED,然后是 :。如果项目完全匹配此分隔符(请参阅 Regex.IsMatch(x, $"^{rx}$") 中的 ^$ anchor ) 那么它必须保持原样,否则,将构建一串空格 new String(' ', x.Length)

如果您需要纯粹的正则表达式解决方案,您可以使用

var delim = @"\b(?:CATEGORY|PRODUCT|DATE (?:CREA|DELE)TED):";
Console.WriteLine(Regex.Replace(s, $@"(\G(?!^)\s*|{delim}\s*)(?!{delim})\S", "$1 "));

参见this regex demo .

详细信息

  • (\G(?!^)\s*|{delim}\s*) - 第 1 组(替换模式中的 $1):结束上一个匹配 (\G(?!^)) 后跟 0+ 空格 (\s*) 或 (|) delim 具有 0+ 空格的模式
  • (?!{delim})\S - 任何不是 delim 序列起始字符的非空白字符

关于c# - C# 替换字符串的部分内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53506568/

相关文章:

php - 希伯来语正则表达式匹配在 php 中不起作用

c# - Razor runco​​mpile 不允许我调试

C#- ASP.net MVC 3- 向表中插入多行

C# HttpClient 在非成功状态代码上抛出异常

javascript - 从对象键创建正则表达式

c - 防止 C 键盘输入中的 ANSI 转义字符

c# - IIS 7 配置数据库 : Setting the framework version and the managed pipeline mode programmatically

Python多个正则表达式清理文件

Python内括号字符串解析

java - 关于 Java 中的字符串不变性