正则表达式匹配 C# 中的 Json 数组元素

Posted

技术标签:

【中文标题】正则表达式匹配 C# 中的 Json 数组元素【英文标题】:Regex to Match Json array element in C# 【发布时间】:2016-12-08 23:52:52 【问题描述】:

我需要匹配 c# 中 JSON 数组元素的元素,以便在 c# 中过滤自动完成。这是我的代码:

string firstname = "h";
List<user> userlist = new List<user>();
user user1 = new user();
user1.firstname = "Hardik";
user1.lastname = "Gondalia";
userlist.Add(user1);

user user2 = new user();
user2.firstname = "John";
user2.lastname = "Abraham";
userlist.Add(user2);

user user3 = new user();
user3.firstname = "Will";
user3.lastname = "Smith";
userlist.Add(user3);

user user4 = new user();
user4.firstname = "Martin";
user4.lastname = "Luthor";
userlist.Add(user4);

var myRegex = new Regex(".*\\b" + firstname + "\\b.*");
var u = userlist.Where(i => myRegex.IsMatch(i.firstname)).ToList();
return Json(u, JsonRequestBehavior.AllowGet);

当我将字符“h”作为名字传递时,我得到了 u = 0 的计数; 我期待变量 u 中有 user1 和 user2。

【问题讨论】:

“我期待 user1 和 user2” - 为什么? \bh\b 将只匹配孤独站立的 h 因为“单词边界”\b...也许从阅读正则表达式教程开始。 嗯,这些名字不包含 h 作为一个完整的单词。而Hardik 包含一个大写的H(将RegexOptions.IgnoreCase 标志传递给myRegex)。此外,Regex.IsMatch 也可以找到部分匹配项,您的模式中根本不需要 .*。从代码来看,你可以在没有正则表达式的情况下实现,使用userlist.Where(i =&gt; culture.CompareInfo.IndexOf(i.firstname, firstname, CompareOptions.IgnoreCase) &gt;= 0).ToList()(见***.com/questions/444798/…) @CodeCaster :你的意思是说 \b 将匹配整个单词而不是单个字符? 这里为什么还需要正则表达式 @zerkms :我认为正则表达式是不错的选择。任何其他方法都是最受欢迎的。 【参考方案1】:

我正在发布一个答案,因为这里有几个问题。

首先,这些名字不包含 h 作为一个完整的单词,并且您在模式中定义了 \b 以匹配名字作为一个完整的单词。

其次,Hardik 包含一个大写的H(因此,您应该考虑将 RegexOptions.IgnoreCase 标志传递给 myRegex)。

第三,Regex.IsMatch 也可以找到部分匹配项,您的模式中根本不需要 .*

从代码来看,你可以在没有正则表达式的情况下实现,使用

userlist.Where(i => culture.CompareInfo.IndexOf(i.firstname, firstname, CompareOptions.IgnoreCase) >= 0).ToList()

【讨论】:

以上是关于正则表达式匹配 C# 中的 Json 数组元素的主要内容,如果未能解决你的问题,请参考以下文章

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?

C# 正则表达式匹配数组

C# 正则表达式获取json字符串中的键值

c#使用正则表达式匹配数据 并计算填入新的值

正则表达式

从数组中删除与正则表达式不匹配的元素