从字符串c#中获取特定单词

时间:2016-01-14 16:06:08

标签: c# .net regex string

我正在做一个最后一年的项目。我有一个包含一些文本的文件。我需要从包含" // jj"的文件中获取单词。标签。例如abc // jj,bcd // jj等。

假设文件包含以下文本

  

ffafa adada // bb adad ssss // jj aad adad adadad aaada dsdsd // jj   dsdsd sfsfhf // vv   dfdfdf

我需要与// jj标签相关的所有单词。这几天我被困在这里。 我正在尝试的代码

  // Create OpenFileDialog
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

        // Set filter for file extension and default file extension
        dlg.DefaultExt = ".txt";
        dlg.Filter = "Text documents (.txt)|*.txt";

        // Display OpenFileDialog by calling ShowDialog method
        Nullable<bool> result = dlg.ShowDialog();

        // Get the selected file name and display in a TextBox
        string filename = string.Empty;
        if (result == true)
        {
            // Open document
            filename = dlg.FileName;
            FileNameTextBox.Text = filename;
        }

        string text;
        using (var streamReader = new StreamReader(filename, Encoding.UTF8))
        {
            text = streamReader.ReadToEnd();
        }

        string FilteredText = string.Empty;

        string pattern = @"(?<before>\w+) //jj (?<after>\w+)";

        MatchCollection matches = Regex.Matches(text, pattern);

        for (int i = 0; i < matches.Count; i++)
        {
            FilteredText="before:" + matches[i].Groups["before"].ToString();
            //Console.WriteLine("after:" + matches[i].Groups["after"].ToString());
        }

        textbx.Text = FilteredText;

我无法找到我的结果请帮助我。

4 个答案:

答案 0 :(得分:7)

使用LINQ,您可以使用一行执行此操作:

string[] taggedwords = input.Split(' ').Where(x => x.EndsWith(@"//jj")).ToArray();

你所有的// jj词都会在那里......

答案 1 :(得分:3)

就我个人而言,如果这绝对是字符串的外观,那么我认为正则表达式太过分了。您还没有指定您肯定需要使用正则表达式,那么为什么不试试呢?

// A list that will hold the words ending with '//jj'
List<string> results = new List<string>();

// The text you provided
string input = @"ffafa adada//bb adad ssss//jj aad adad adadad aaada dsdsd//jj dsdsd sfsfhf//vv dfdfdf";

// Split the string on the space character to get each word
string[] words = input.Split(' ');

// Loop through each word
foreach (string word in words)
{
    // Does it end with '//jj'?
    if(word.EndsWith(@"//jj"))
    {
        // Yes, add to the list
        results.Add(word);
    }
}

// Show the results
foreach(string result in results)
{
    MessageBox.Show(result);
}

结果是:

  

SSSS // JJ
  dsdsd // JJ

显然这不像正则表达式那么强大,但你没有为我提供更多细节。

答案 2 :(得分:2)

你的正则表达式中有一个额外的空格,它假定在“// jj”之前有一个空格。你想要的是:

 string pattern = @"(?<before>\w+)//jj (?<after>\w+)";

答案 3 :(得分:0)

这个正则表达式将产生您要查找的单词:

string pattern = "(\\S*)\\/\\/jj"

在没有反斜杠转义的情况下更好一点:

(\S*)\/\/jj

匹配将包含//jj,但您可以从第一个括号内的小组中获取该字词。