查找字符串模式

时间:2018-09-10 14:08:12

标签: c#

我正在尝试制作一个正在寻找用户输入的字符串的应用程序。将有一个文本文件,该文本文件将存储很多字符串,应用程序将检查是否可以在此文件中找到该字符串并显示该字符串的索引。如果找不到该字符串,则应用程序将查找特定的模式。

这是文本文件的示例:

This
This |
This is |
This car is #

| - one word
# - one or more words

应用程序如何工作?

  • 如果“ This”是用户输入的字符串,则应用程序将显示第一行的索引(0)。
  • 如果“ This apple”是用户输入的字符串,则应用程序将显示“ This |”的索引(1)。
  • 如果用户输入的字符串为“ This is awesome”,则应用程序将显示索引“ This is |” (2)。
  • 如果用户输入的字符串是“蓝色的车,我喜欢它”,则应用程序将显示“这辆车是#”的索引(3)。

通常,如果我正在寻找一个字符串,我会使用以下代码:

string[] grammarFile = File.ReadAllLines(@"C:\Users\user_name\Desktop\Text.txt");
int resp = Array.IndexOf(grammarFile, userString);
Console.WriteLine(resp);

主要问题是我不知道如何针对模式进行此操作。

1 个答案:

答案 0 :(得分:0)

您需要一个单词的定义。我会假设 word 是任何非空白字符的连续字符串。

让我们定义一个与单个单词匹配的正则表达式:

var singleWordRegex = @"[^\s]+"; 

和匹配一个或多个单词的正则表达式(一系列非空白字符,后跟一系列空白字符或字符串的结尾):

var oneOrMoreWordsRegex = @"([^\s]+([\s]|$)+)+";

现在,您可以像这样将每个字符串从文本文件转换为正则表达式:

Regex ToRegex(this string grammarEntry)
{
    var singleWordRegex = @"[^\s]+";
    var oneOrMoreWordsRegex = @"([^\s]+([\s]|$)+)+";

    return new Regex("^" + grammarEntry.Replace("|", singleWordRegex).Replace("#", oneOrMoreWordsRegex) + "$" );
}

并像这样测试每个语法条目:

var userString = ReadUserString();
string[] grammarFile = File.ReadAllLines(@"C:\Users\user_name\Desktop\Text.txt");
var resp = -1;

for(int i = 0; i < grammarFile.Length; ++i)
{
    var grammarEntry = grammarFile[i];

    if(grammarEntry.ToRegex().IsMatch(userString))
    {
        resp = i;
        break;
    }
}

Console.WriteLine(resp);

另一方面,如果要执行许多匹配,将所有ToRegex调用保存到数组作为预处理可能是明智的。