正则表达式,用于在某个字符串出现后查找两个字符串

本文关键字:字符串 查找 两个 用于 正则表达式 | 更新日期: 2023-09-27 18:13:35

我想删除一个过滤词后面出现的两个单词,并删除字符串中的过滤词。例如下面一行:

MY FILE = "/test/test.txt" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = "NOT APPLICABLE"

过滤器是VERSION,我想从上面的行删除VERSION = 3和VERSION = "NOT APPLICABLE"。

所以上面的行应该看起来像:

MY FILE = "/test/test.txt" CRC = 0x1ECC2C78 XYZ = ABC

像VERSION这样的过滤器参数将动态传递,并且行将具有不同的格式。以上只是一个例子

正则表达式,用于在某个字符串出现后查找两个字符串

这个简单的正则表达式应该可以工作:

var s = "MY FILE = '"/test/test.txt'" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = '"NOT APPLICABLE'"";
var r = new Regex("(MY FILE.*) VERSION.*(CRC.*)VERSION.*");
var m = r.Match(s);
var output = string.Format("{0} {1}",m.Groups[1],m.Groups[2]);

输出为

MY FILE = "/test/test.txt" CRC = 0x1ECC2C78 XYZ = ABC 

编辑

在OP对问题的编辑之后,有一个不同的解决方案。假设:

  • name=value对的单行字符串
  • 名称可以有空格(即我的文件),但不能在引号中
  • value可以有空格,但必须加引号("MY value ")

MY FILE = "/test/test.txt" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = "NOT APPLICABLE"

和更新后的代码:

var original = "MY FILE = '"/test/test.txt'" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = '"NOT APPLICABLE'"";
var nameToRemove = "VERSION";
var stringBuilder = new StringBuilder();
var s = original;
while(s.Length>0)
{
    var getNameRegex = new Regex("(.*?)=");
    var name = getNameRegex.Match(s).Groups[1].ToString();
    s = s.Substring(name.Length+1);
    Regex getValueRegex;
    if (s.TrimStart().StartsWith("'""))
    {
        getValueRegex =new Regex("(''s*'".*?'"''s*)");
    }
    else
    {
        getValueRegex =new Regex("(''s*.*?)''s+");
    }
    var value = getValueRegex.Match(s).ToString();
    s = s.Substring(value.Length);
    if (name.Trim() != nameToRemove)
    {
        stringBuilder.Append(name).Append("=").Append(value);
    }   
}
Console.WriteLine ("original : {0}",original);
Console.WriteLine ("parsed   : {0}",stringBuilder.ToString());

和用不同的词调用上面的命令来移除产生:

original : MY FILE = "/test/test.txt" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = "NOT APPLICABLE"
parsed   : MY FILE = "/test/test.txt" CRC = 0x1ECC2C78 XYZ = ABC 
我文件

original : MY FILE = "/test/test.txt" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = "NOT APPLICABLE"
parsed   : VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = "NOT APPLICABLE"

CRC

original : MY FILE = "/test/test.txt" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = "NOT APPLICABLE"
parsed   : MY FILE = "/test/test.txt" VERSION = 3 XYZ = ABC VERSION = "NOT APPLICABLE"

DUMMY(字符串中不存在)

original : MY FILE = "/test/test.txt" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = "NOT APPLICABLE"
parsed   : MY FILE = "/test/test.txt" VERSION = 3 CRC = 0x1ECC2C78 XYZ = ABC VERSION = "NOT APPLICABLE"