Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串c中获取特定单词#_C#_.net_Regex_String - Fatal编程技术网

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

C# 从字符串c中获取特定单词#,c#,.net,regex,string,C#,.net,Regex,String,我正在做一个最后一年的项目。我有一个包含一些文本的文件。我需要从这个文件中获取包含“//jj”标记的单词。e、 g abc//jj、bcd//jj等 假设文件包含以下文本 ffafa adada//bb adad SSS//jj adad adad adad adada DSD//jj dsd-sfhf//vv dfdfdf 我需要与//jj标记关联的所有单词。过去几天我被困在这里。 我正在尝试的代码 // Create OpenFileDialog Microsoft.Wi

我正在做一个最后一年的项目。我有一个包含一些文本的文件。我需要从这个文件中获取包含“//jj”标记的单词。e、 g abc//jj、bcd//jj等

假设文件包含以下文本

ffafa adada//bb adad SSS//jj adad adad adad adada DSD//jj dsd-sfhf//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;
//创建OpenFileDialog
Microsoft.Win32.OpenFileDialog dlg=新的Microsoft.Win32.OpenFileDialog();
//为文件扩展名和默认文件扩展名设置筛选器
dlg.DefaultExt=“.txt”;
dlg.Filter=“文本文档(.txt)|*.txt”;
//通过调用ShowDialog方法显示OpenFileDialog
可为空的结果=dlg.ShowDialog();
//获取所选文件名并显示在文本框中
字符串文件名=string.Empty;
如果(结果==真)
{
//打开文件
filename=dlg.filename;
FileNameTextBox.Text=文件名;
}
字符串文本;
使用(var streamReader=newstreamreader(文件名,Encoding.UTF8))
{
text=streamReader.ReadToEnd();
}
string FilteredText=string.Empty;
字符串模式=@“(?\w+//jj(?\w+);
MatchCollection matches=Regex.matches(文本、模式);
for(int i=0;i

我找不到我的结果,请帮助我。

此正则表达式将生成您要查找的单词:

string pattern = "(\\S*)\\/\\/jj"
在没有反斜杠转义的情况下更好一些:

(\S*)\/\/jj

匹配项将包括
//jj
,但您可以从第一个括号中的组中获取单词。

我个人认为,如果字符串确实是这样的话,正则表达式就太过分了。您还没有指定确实需要使用Regex,那么为什么不试试这个呢

// 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);
}
//包含以“//jj”结尾的单词的列表
列表结果=新列表();
//你提供的文本
字符串输入=@“ffafa adada//bb adad ssss//jj aad adad adad aada dsd//jj dsd sfsfsfhf//vv dfdfdfdfdfdfdf”;
//拆分空格字符上的字符串以获得每个单词
string[]words=input.Split(“”);
//循环浏览每个单词
foreach(单词中的字符串)
{
//它是否以“//jj”结尾?
if(word.EndsWith(@”//jj”))
{
//是的,添加到列表中
结果:添加(word);
}
}
//显示结果
foreach(结果中的字符串结果)
{
MessageBox.Show(结果);
}
结果如下:

ssss//jj
dsd//jj


显然,这没有正则表达式那么健壮,但您没有提供更多细节供我继续。

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

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

使用
LINQ
您可以用一行代码完成此操作:

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

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

在我尝试帮助你之前,我能请你确认项目的要求允许你向外部来源寻求帮助吗?你的代码是什么样子的?如果
abc//ss abc//gg//jj
应该返回0个匹配项,那么
(\w+)\/\/jj
也能起作用。在多大程度上正则表达式是过度的?因为除非你知道自己在做什么,否则阅读和理解起来很复杂,而OP似乎不知道。IMHO说,上面的代码更像是初学者获得相同结果的方法,而且更容易理解。我并不是说正则表达式比较慢,如果这是你的意思的话。我的解决方案是类似的,但使用Linq得到相同的结果results=words.Where(s=>s.Trim().EndsWith(@”//jj)).ToArray();我喜欢一点LINQ,我只是想保持它的简洁,因为,嗯,我很简单!我又卡住了,因为我在文件中的文本是其他语言的,比如乌尔都语和阿拉伯语,而不是英语,在你的两个代码中都没有得到特定的单词,因为它无法拆分。很好!你提醒我再去读一次我的《傻瓜林克》这本书;-)我只是想说我很嫉妒我没有想到使用LINQ,因为我最近一直在学习使用它:-)@Equalsk啊,我明白了……)这就是你的意思。哈哈,别担心,到时候我还是会投票支持你的答案的这样,你就不会觉得你的答案被浪费了对于新程序员来说,您的答案实际上比LINQ更容易理解。我的意思是:这仍然是一个很好的答案这很有帮助。ThanksI再次卡住了,因为我在文件中的文本是其他语言,如乌尔都语和阿拉伯语,而不是英语,在这两种代码中,由于无法拆分,无法获取特定的单词