如何使用Regex匹配关键字

gab6jxml  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(108)

我有一个关键字,例如,“SOS火灾”。我想在使用Regex的列表中找到它。当我直接定义时,它可以很好地工作,但似乎它没有传递keyword的引用。

//2023 - 07 - 07 14:30:27,266 | datatemp 1 | datatemp x | SOS fire //match
//2023 - 07 - 07 14:30:27,266 | datatemp 2 | datatemp y | Data SOS beach //not match
//2023 - 07 - 07 14:30:27,266 | datatemp 3 | datatemp z | SOS fire homes //match
var str = "2023-07-07 14:30:27,266|datatemp 1|datatemp x |SOS fire \r\n2023-07-07 14:30:27,266|datatemp 2|datatemp y |Data SOS beach \r\n2023-07-07 14:30:27,266|datatemp 3|datatemp z |SOS fire homes ";
var list = str.Split(new string[] { "\r\n" }, StringSplitOptions.None).ToList();
var keyword = "SOS fire";
var count = 0;
foreach (var item in list)
{
    if (Regex.IsMatch(item.TrimStart().TrimEnd(), @"\|(.+?)\|(.+?)\|\b("" + keyword + "")\b"))
    {
        count += 1;
    }
}

字符串
对这个案子有什么想法,给予我点建议。我试过这个选项,可以找到:


的数据

uemypmqf

uemypmqf1#

如果你尝试打印出字符串字面量,你会看到结果:
|(.+?)|\B(“+关键字+“)\b|\b(" + keyword + ")\b
没有正确的方法来分配字符串文字的值。你应该使用String.Format()

String.Format(@"\|(.+?)\|(.+?)\|\b({0})\b", keyword)

字符串
并声明已编译的正则表达式,而不是在循环中每次都创建未编译的正则表达式,以提高性能。标签:正则表达式缓存

Regex regex = new Regex(String.Format(@"\|(.+?)\|(.+?)\|\b({0})\b", keyword));
foreach (var item in list)
{
    if (regex.IsMatch(item.TrimStart().TrimEnd()))
    {
        count += 1;
    }
}

相关问题