我有一系列看起来像“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
可以将匹配添加到结果数组中。它匹配整个单词 CATEGORY
、PRODUCT
、DATE CREATED
和 DATE 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/