正则表达式,用于在某个字符串出现后查找两个字符串
本文关键字:字符串 查找 两个 用于 正则表达式 | 更新日期: 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"