正则表达式 - 获取部分字符串

时间:2015-09-25 15:15:27

标签: c# regex

我有一个项目名称列表,我需要一些匹配。项目列表可能如下所示:

suzu
suzu-domestic
suzu-international
suzuran
suzuran-international
scorpion
scorpion-default
yada
yada-yada
etc

如果搜索的项目是suzu,我希望从列表中得到以下结果:

suzu
suzu-domestic
suzu-international

包含suzuran的任何内容。如果搜索项目为suzuran

,我也希望得到以下匹配项
suzuran
suzuran-international

包含suzu的任何内容。

在C#代码中,我的内容与此类似:

String searchForProject = "suzu";
String regStr = @"THE_REGEX_GOES_HERE"; // The regStr will be in a config file
List<Project> projects = DataWrapper.GetAllProjects();
Regex regEx = new Regex(String.Format(regStr, searchForProject));
result = new List<Project>();
foreach (Project proj in projects)
{
  if (regEx.IsMatch(proj.ProjectName))
  {
    result.Add(proj);
  }
}

问题是,我是否可以使用正则表达式来使我能够在所有确切的项目名称上获得匹配,但不能获得由startWith等效项返回的项目名称? (今天我有一个regStr = @"^({0})#",但这不符合上述情况,因为它会提供比它应该更多的点击量。

如果有人能给我一个正确方向的暗示,我会很感激。谢谢 ! 马格努斯

5 个答案:

答案 0 :(得分:2)

实际需要的只是

var regStr = @"^{0}\b";

^锚点在字符串开头处断言位置。 \b模式匹配单词和非单词字符之间的位置,即字符串的开头或结尾。由于您使用的是.*,因此您无需将其余字符串与Regex.IsMatch匹配,这是一个多余的开销。

C#测试代码:

var projects = new List<string>() { "suzu", "suzu-domestic", "suzu-international", "suzuran", "suzuran-international", "scorpion", "scorpion-default", "yada", "yada-yada" };
var searchForProject = "suzu";
var regStr = @"^{0}\b"; // The regStr will be in a config file

var regEx = new Regex(String.Format(regStr, searchForProject));
var result = new List<string>();
foreach (var proj in projects)
{
    if (regEx.IsMatch(proj))
    {
        result.Add(proj);
    }
}

enter image description here

foreach可能会被更短的LINQ替换:

var result = projects.Where(s => regEx.IsMatch(s)).ToList();

答案 1 :(得分:0)

你可以使用这样的正则表达式:

^suzu\b.*

<强> Working demo

如果您希望suzuran使用:

^suzuran\b.*

答案 2 :(得分:0)

如果您希望匹配字符串中的任何位置(但不在单词的中间),则可以使用"\b{0}\b.*";如果您只想在开头使用"^{0}\b.*",则可以使用#!/bin/sh DISPLAY=:0 export DISPLAY /home/salwa/computing/cpp/horloge

查看regexstorm示例。

答案 3 :(得分:0)

如果您希望在Linq和没有正则表达式的一行中使用优雅的解决方案,您可以检查此工作解决方案(在.NETFiddle上演示):

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public void Main()
    {
        string input = "suzu";
        string s = @"suzu
suzu-domestic
suzu-international
suzuran
suzuran-international
scorpion
scorpion-default
yada
yada-yada";

        foreach (var line in ExtractLines(s, input))
            Console.WriteLine(line);    
    }

    // works if "-" is your delimiter.
    IEnumerable<string> ExtractLines(string lines, string input)
    {
        return from line in lines.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) // use to split your string by line
            let cleanLine = line.Contains("-") ? line.Split('-')[0] : line // use only the needed part
            where cleanLine.Equals(input) // check if the output match with the input
            select line; // return the valid line
    }
}

答案 4 :(得分:0)

负向前瞻:

suzu(?!.*ran).*\b

这也使用\ b进行分词