如何完全抛弃不匹配正则表达式模式的字符串的出现?

时间:2018-04-11 23:40:07

标签: c# regex linq

我正在为字符串列表实现正则表达式模式。这种字符串的示例是:"MNT-PUT-Y0-HAS90"。还有其他UNWANTED字符串,例如:"MNT-PUT-HAS90"

当我执行以下代码时,我得到""对于不需要的人,我猜是正则表达式如何运作。而且,我得到了"MNT-PUT-Y0-HAS90"来获得想要的那个。

问题是:我怎样才能完全忽略MNT-PUT-HAS90的发生。我想只检索字符串的结果 - "MNT-PUT-Y0-HAS90"

我为此实现了以下代码:

Store = a.Type == "Machines" ? 
string.Join(",", a.Info.Disk.Select(b => b.Store).
Select(x => Regex.Match(x, "[A-Z]+-[A-Z]+-T[0-9]-[A-Z]+[0-9]"))) : null

我尝试将代码更改为以下内容,但它显示错误:"Cannot convert lambda expression to the intended delegate type because some of the return types in the block are not implicitly convertible to the delegate return type"

Store = a.Type == "Machines" ? 
    string.Join(",", a.Info.Disk.Select(b => b.Store).
    Where(x => Regex.Match(x, "[A-Z]+-[A-Z]+-T[0-9]-[A-Z]+[0-9]")).ToString()) : null

修改 试过这个:

Store = a.Type == "Machines" ? 
        string.Join(",", a.Info.Disk.Select(b => b.Store).
        Where(x => Regex.IsMatch(x, "[A-Z]+-[A-Z]+-T[0-9]-[A-Z]+[0-9]")).ToList()) : null

我没有错误,但也没有获得所需的输出。

2 个答案:

答案 0 :(得分:1)

您需要使用

Regex.IsMatch(x, "^[A-Z]+-[A-Z]+-[A-Z]+[0-9]+-[A-Z]+[0-9]+$")

请参阅how this regex works

<强>详情

  • ^ - 字符串的开头
  • [A-Z]+ - 1+ ASCII大写字母
  • - - 一个超人
  • [A-Z]+- - - 1+ ASCII大写字母和连字符
  • [A-Z]+[0-9]+- - 1 + ASCII大写字母,1 + ASCII数字,然后是连字符
  • [A-Z]+[0-9]+ - 1 + ASCII大写字母,1 + ASCII数字
  • $ - 字符串结束。

代码:

Store = a.Type == "Machines" ? 
    string.Join(",", 
        a.Info.Disk
           .Select(b => b.Store)
           .Where(x => Regex.IsMatch(x, "^[A-Z]+-[A-Z]+-[A-Z]+[0-9]+-[A-Z]+[0-9]+$"))
    ) 
    : null;

如果预计匹配在较长字符串中的任何位置,请移除^$个锚点。

答案 1 :(得分:0)

这是一个非常简单的解决方案,但不知怎的,我错过了它... 我做了以下解决问题:

Store = a.Type == "Machines" && a.Power == "on" && 
       string.Join(",", a.Info.Disk.Select(b => b.Store).
       Where(x => Regex.Match(x, "[A-Z]+-[A-Z]+-T[0-9]-[A-Z]+[0-9]"))) != "" ?
       "Do your stuff" : null