Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换字符串C的部分#_C#_Regex_String - Fatal编程技术网

C# 替换字符串C的部分#

C# 替换字符串C的部分#,c#,regex,string,C#,Regex,String,我有一系列看起来像“WORD1:JUNK1 WORD2:JUNK2”的字符串,我想从字符串中删除垃圾,同时保留单词之间的字符数(包括垃圾所占用的字符数) 我有一个列表,上面列出了将要使用的词,但不是垃圾词 单词、每行之间的空格数和垃圾都会改变每一行 到目前为止,我一直在使用一个正则表达式,比如(word | word | word)(.\*)(word | word | word)(.*),但我不知道如何保持这种格式 已编辑 对不起,你是对的,WORD1/WORD2和JUNK1/JUNK2是

我有一系列看起来像“WORD1:JUNK1 WORD2: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 "));

详细信息

  • (\G(?)\s*{delim}\s*)
    -第1组(
    $1
    ,在替换模式中):前一个匹配(
    \G(?)
    )的结束,后跟0+空格(
    \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);
          }
      }