【问题标题】:Regex to check to find out items with given character正则表达式检查以找出具有给定字符的项目
【发布时间】:2014-12-23 13:53:24
【问题描述】:

我有课

public class MyClass
        {
            public MyClass(int id, string name)
            {
                this.Id = id;
                //Id = id;
                this.Name = name;
            }
            public int Id { get; set; }
            public string Name { get; set; }
        }

我创建了一个 MyClass 类型的列表并在其中添加了一些项目

    List<MyClass> lst = new List<MyClass>();
    lst.Add(new MyClass(1, "Name1"));
    lst.Add(new MyClass(2, "ab****cdefg"));
    lst.Add(new MyClass(3, "he*llo"));
    lst.Add(new MyClass(4, "pa**yed"));
    lst.Add(new MyClass(5, "Names2"));
    lst.Add(new MyClass(6, "hi******iiii"));
    lst.Add(new MyClass(7, "so*me"));
    lst.Add(new MyClass(8, "so**rt"));
    lst.Add(new MyClass(9, "*"));
    lst.Add(new MyClass(10, "**"));
    lst.Add(new MyClass(11, "t*e*s*t"));
    lst.Add(new MyClass(12, "t**e**s**t"));

我如何才能找到列表中名称字段中只有一个 * 和另一个列表中名称字段中两个 ** 的项目。我想通过 linq 或 regex 来做,也邀请任何其他好的选择。我尝试使用contains 方法,但得到了所有具有* 的项目。

var singlestar = lst.Where(x => x.Name.Contains("*")).ToList();

【问题讨论】:

  • 你想要一个ints 列表,代表与两个列表的条件都匹配的 ID?
  • 不,我想要MyClass的列表
  • 这真的没有意义。您将拥有 2 个 MyClass 和不同的 Names,一个拥有 1 个 *,一个拥有 2 个 *。你想要哪个MyClass
  • @Jonesy : 我想要两个不同的列表

标签: c# asp.net regex asp.net-mvc-3


【解决方案1】:

这应该匹配只有一个“\*”和两个“\*\*”的名称

var singlestar = lst.Where(x =>Regex.Matches(x.Name,  "\\*").Count == 1).ToList();
var twostar = lst.Where(x =>Regex.Matches(x.Name,  "\\*\\*").Count == 1).ToList();

【讨论】:

  • 感谢 1 星的解决方案,它有效,我想出了两个 ** 但你能在你的回答中解释一下 .Count == 1 的作用吗?
  • @SidM 正则表达式匹配 *.所以这会计算一个字符串中的匹配项。
  • 请注意,这不能正确处理"abc*defg*" 之类的事情。我不知道 OP 是否需要识别这些,但您的代码不会将其识别为包含单个“*”。
【解决方案2】:

如果您只需要单颗星,我怀疑这些不应包含至少 2 颗星。如果星星可能会出现在其他地方,那么正则表达式可能会更好。

var singlestar = lst.Where(x => (x.Name.Contains("*") and !(x.Name.Contains("**")))).ToList();

var doublestar = lst.Where(x => (x.Name.Contains("**") and !(x.Name.Contains("***")))).ToList();

或者使用正则表达式

Regex rgx1 = new Regex(@"^[^*]*\\*[^*]*$");
Regex rgx2 = new Regex(@"^[^*]*\\*\\*[^*]*$");
var singlestar = lst.Where(x => rgx1.IsMatch(x.Name)).ToList();

var doublestar = lst.Where(x => rgx2.IsMatch(x.Name)).ToList();

使用正则表达式,名称中的其他任何地方都不应有其他星号。

【讨论】:

  • 1) 我想要两个不同的列表 2) 名称中可以有任意数量的 *
  • 第二个列表应该包含什么,只有两个?第一个列表占两个或更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2016-02-15
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多