C# 替换字符串C的部分#
我有一系列看起来像“WORD1:JUNK1 WORD2:JUNK2”的字符串,我想从字符串中删除垃圾,同时保留单词之间的字符数(包括垃圾所占用的字符数)C# 替换字符串C的部分#,c#,regex,string,C#,Regex,String,我有一系列看起来像“WORD1:JUNK1 WORD2:JUNK2”的字符串,我想从字符串中删除垃圾,同时保留单词之间的字符数(包括垃圾所占用的字符数) 我有一个列表,上面列出了将要使用的词,但不是垃圾词 单词、每行之间的空格数和垃圾都会改变每一行 到目前为止,我一直在使用一个正则表达式,比如(word | word | word)(.\*)(word | word | word)(.*),但我不知道如何保持这种格式 已编辑 对不起,你是对的,WORD1/WORD2和JUNK1/JUNK2是
- 我有一个列表,上面列出了将要使用的词,但不是垃圾词
- 单词、每行之间的空格数和垃圾都会改变每一行
(word | word | word)(.\*)(word | word | word)(.*)
,但我不知道如何保持这种格式
已编辑
对不起,你是对的,WORD1/WORD2和JUNK1/JUNK2是我看到的实际值的变量。它的所有字母数字字符和斜杠
输入示例:
“类别:(4个空格)侧面(3个空格)创建日期:(3个空格)2016年3月12日”
“产品:(6个空格)胡萝卜(4个空格)删除日期:(4个空格)2017年11月5日”
输出示例:
“类别:(12个空格)创建日期:(11个空格)”
“产品:(17个空格)删除日期:(12个空格”
我试图用空格来替换单词“SIDES”和“03/12/16”。相反,我希望类别和创建日期之间的字符数保持不变,并且都是空格。我相信有人会用正则表达式给你一个清晰的答案,但这里有一个快速解决方案:
string msg = "this is a silly test message";
string[] junk = new string[] { "silly", "message" };
foreach(string j in junk)
{
msg = Regex.Replace(msg, j, string.Empty.PadRight(j.Length));
}
我建议基于
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))
)
);
见
(\b(?:类别|产品|日期(?:CREA | DELE)TED):)
regex是捕获组中的分隔符模式,因此regex.Split
可以将匹配项添加到结果数组中。它匹配整个单词类别
,产品
,创建日期
和删除日期
,然后是:
。如果项目完全匹配此分隔符(请参见^
和$
锚定在Regex.IsMatch(x,$“^{rx}$”
)中,然后它必须保持原样,否则,将生成一个空格字符串新字符串('',x.Length)
如果您需要纯正则表达式解决方案,可以使用
var delim = @"\b(?:CATEGORY|PRODUCT|DATE (?:CREA|DELE)TED):";
Console.WriteLine(Regex.Replace(s, $@"(\G(?!^)\s*|{delim}\s*)(?!{delim})\S", "$1 "));
看
详细信息
-第1组((\G(?)\s*{delim}\s*)
,在替换模式中):前一个匹配($1
)的结束,后跟0+空格(\G(?)
)或(\s*
)带有0+空格的
模式delim
-不是(?!{delim})\S
序列起始字符的任何非空白字符delim
- 我认为这是一个有趣的实验,我想出了一个与其他答案截然不同的方法
public class WordStripper
{
public string StripWords(string input)
{
var ignoreWords = new List<string>
{
"CATEGORY:",
"DATE CREATED:",
"PRODUCT:",
"DATE DELETED:"
};
var deliminator = string.Join("|", ignoreWords);
var splitInput = Regex.Split(input, $"({deliminator})");
var sb = new StringBuilder();
foreach (var word in splitInput)
{
if (ignoreWords.Contains(word))
{
sb.Append(word);
}
else
{
var wordLength = word.Length;
sb.Append(new string(' ', wordLength));
}
}
return sb.ToString();
}
}
你所追求的东西,是否总是一个单词(
a-Za-z
)后面带冒号?你能把你的文章包含完整的输入和预期的输出吗?把它分成几个单词——替换掉你不想要的单词,然后再把它们连接起来吗?如果你能在之前(输入)和之后(预期输出)发表一些文章的话,这会让你的问题更容易理解。你是说输入:WORD1:JUNK1 WORD2:JUNK2“
output:WORD1:\uuuuuuuuuuuuuuuuuuuword2:\uuuuuuuuuuuuuuuuuuuuuuuuu:
?如果我理解正确,你想找到它写“垃圾”的地方,并用4个空格或其他字符替换它吗?不能String.replace()
为你工作吗?
[TestFixture]
public class Test
{
[Test]
[TestCase("CATEGORY: SIDES DATE CREATED: 03/12/16", "CATEGORY: DATE CREATED: ")]
[TestCase("PRODUCT: CARROTS DATE DELETED: 05/11/17", "PRODUCT: DATE DELETED: ")]
public void TestMethod(string input, string expectedResult)
{
//arrange
var uut = new WordStripper();
//act
var actualResults = uut.StripWords(input);
//assert
Assert.AreEqual(expectedResult, actualResults);
}
}