简体   繁体   中英

Searching the first few characters of every word within a string in C#

I am new to programming languages. I have a requirement where I have to return a record based on a search string.

For example, take the following three records and a search string of "Cal":

  1. University of California

  2. Pascal Institute

  3. California University

I've tried String.Contains , but all three are returned. If I use String.StartsWith , I get only record #3. My requirement is to return #1 and #3 in the result.

Thank you for your help.

If you're using .NET 3.5 or higher, I'd recommend using the LINQ extension methods . Check out String.Split and Enumerable.Any . Something like:

string myString = "University of California";
bool included = myString.Split(' ').Any(w => w.StartsWith("Cal"));

Split divides myString at the space characters and returns an array of strings. Any works on the array, returning true if any of the strings starts with "Cal" .

If you don't want to or can't use Any , then you'll have to manually loop through the words.

string myString = "University of California";
bool included = false;

foreach (string word in myString.Split(' '))
{
    if (word.StartsWith("Cal"))
    {
        included = true;
        break;
    }
}

You can try:

foreach(var str in stringInQuestion.Split(' '))
{
  if(str.StartsWith("Cal"))
   {
      //do something
   }
}

I like this for simplicity:

if(str.StartsWith("Cal") || str.Contains(" Cal")){
    //do something
}

You can use Regular expressions to find the matches. Here is an example

    //array of strings to check
    String[] strs = {"University of California", "Pascal Institute", "California University"};
    //create the regular expression to look for 
    Regex regex = new Regex(@"Cal\w*");
    //create a list to hold the matches
    List<String> myMatches = new List<String>();
    //loop through the strings
    foreach (String s in strs)
    {   //check for a match
        if (regex.Match(s).Success)
        {   //add to the list
            myMatches.Add(s);
        }
    }

    //loop through the list and present the matches one at a time in a message box
    foreach (String matchItem in myMatches)
    {
            MessageBox.Show(matchItem + " was a match");
    }
        string univOfCal = "University of California";
        string pascalInst = "Pascal Institute";
        string calUniv = "California University";

        string[] arrayofStrings = new string[] 
        {
        univOfCal, pascalInst, calUniv
        };

        string wordToMatch = "Cal";
        foreach (string i in arrayofStrings)
        {

            if (i.Contains(wordToMatch)){

             Console.Write(i + "\n");
            }
        }
        Console.ReadLine();
    }
var strings = new List<string> { "University of California", "Pascal Institute", "California University" };
var matches = strings.Where(s => s.Split(' ').Any(x => x.StartsWith("Cal")));

foreach (var match in matches)
{
    Console.WriteLine(match);
}

Output:

University of California
California University

This is actually a good use case for regular expressions.

string[] words = 
{ 
    "University of California",
    "Pascal Institute",
    "California University"
}

var expr = @"\bcal";
var opts = RegexOptions.IgnoreCase;
var matches = words.Where(x => 
    Regex.IsMatch(x, expr, opts)).ToArray();

The "\\b" matches any word boundary (punctuation, space, etc...).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM