Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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#_Regex - Fatal编程技术网

C#查找文档中是否有单词

C#查找文档中是否有单词,c#,regex,C#,Regex,我正在寻找一种方法,用C#检查文本文件中是否存在“foo”字 我可能会使用正则表达式,但如果将单词分成两行,我不确定这是否有效。我也遇到了同样的问题,一个流线型阅读器,列举了很多行 有什么意见吗?简单的搜索有什么问题吗 如果文件不大,并且内存不是问题,只需将整个文件读入一个字符串(方法),然后使用string Contains()下面是一个使用LINQ的快速示例 static void Main(string[] args) { { //LINQ version

我正在寻找一种方法,用C#检查文本文件中是否存在“foo”字

我可能会使用正则表达式,但如果将单词分成两行,我不确定这是否有效。我也遇到了同样的问题,一个流线型阅读器,列举了很多行


有什么意见吗?

简单的搜索有什么问题吗


如果文件不大,并且内存不是问题,只需将整个文件读入一个字符串(方法),然后使用string Contains()

下面是一个使用LINQ的快速示例

    static void Main(string[] args)
    {
        { //LINQ version
            bool hasFoo = "file.txt".AsLines()
                                    .Any(l => l.Contains("foo"));
        }
        { // No LINQ or Extension Methods needed
            bool hasFoo = false;
            foreach (var line in Tools.AsLines("file.txt"))
                if (line.Contains("foo"))
                {
                    hasFoo = true;
                    break;
                }
        }
    }
}
public static class Tools
{
    public static IEnumerable<string> AsLines(this string filename)
    {
        using (var reader = new StreamReader(filename))
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                while (line.EndsWith("-") && !reader.EndOfStream)
                    line = line.Substring(0, line.Length - 1)
                                + reader.ReadLine();
                yield return line;
            }
    }
}
static void Main(字符串[]args)
{
{//LINQ版本
bool hasFoo=“file.txt”.AsLines()
。任何(l=>l.Contains(“foo”));
}
{//不需要LINQ或扩展方法
bool-hasFoo=false;
foreach(Tools.AsLines(“file.txt”)中的var行)
如果(第行包含(“foo”))
{
hasFoo=真;
打破
}
}
}
}
公共静态类工具
{
公共静态IEnumerable AsLines(此字符串文件名)
{
使用(var reader=newstreamreader(文件名))
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
while(line.EndsWith(“-”&&!reader.EndOfStream)
line=line.Substring(0,line.Length-1)
+reader.ReadLine();
收益率回归线;
}
}
}

在如此简单的情况下,不需要正则表达式。只需在这些行上循环并检查它是否包含
foo

using (StreamReader sr = File.Open("filename", FileMode.Open, FileAccess.Read))
{
    string line = null;
    while (!sr.EndOfStream) {
        line = sr.ReadLine();
        if (line.Contains("foo"))
        {
            // foo was found in the file
        }
    }
}

给你。因此,我们在读取文件时查看字符串,跟踪第一个单词和最后一个单词的组合,并检查是否与您的模式匹配

string pattern = "foo";
string input = null;
string lastword = string.Empty;
string firstword = string.Empty;
bool result = false;

FileStream FS = new FileStream("File name and path", FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader SR = new StreamReader(FS);

while ((input = SR.ReadLine()) != null) 
{
    firstword = input.Substring(0, input.IndexOf(" "));
    if(lastword.Trim() != string.Empty) { firstword = lastword.Trim() + firstword.Trim(); } 

    Regex RegPattern = new Regex(pattern);
    Match Match1 = RegPattern.Match(input);
    string value1 = Match1.ToString(); 

    if (pattern.Trim() == firstword.Trim() || value1 != string.Empty) { result = true;  }

    lastword = input.Trim().Substring(input.Trim().LastIndexOf(" "));
}

如果线里有足球呢?还是傻瓜?如果要使用正则表达式,则需要查找单词边界

Regex r = new Regex("\bfoo\b");

如果需要的话,还要确保考虑到大小写不敏感。

您可以构造一个正则表达式,允许在每个字符之间放置换行符

private static bool IsSubstring(string input, string substring)
{
    string[] letters = new string[substring.Length];
    for (int i = 0; i < substring.Length; i += 1)
    {
        letters[i] = substring[i].ToString();
    }
    string regex = @"\b" + string.Join(@"(\r?\n?)", letters) + @"\b";
    return Regex.IsMatch(input, regex, RegexOptions.ExplicitCapture);
}
private static bool IsSubstring(字符串输入,字符串子字符串)
{
string[]字母=新字符串[substring.Length];
对于(int i=0;i
首先,这听起来像是家庭作业;但如果不是,那么当单词跨越两行时,是否用连字符分割?分割?你是说这个词可以连字符吗?通过splitted,我想说这个词可以在两行上加上:例如,一行末尾的字母“f”,然后是下一行开头的字母“oo”。不,这不是家庭作业。因此,您可能需要构建一个仅检查最后两行的状态机,或者将整个文件连接到一个没有CRLF的字符串中。如果你想要一个状态机,你可以基于我下面的内容。去掉所有行的前导和尾随空格。将这些行连接成一个字符串,去掉所有的行尾。现在使用regexp或子字符串匹配来查看单词是否存在。未看到“拆分”注释。您可以添加检查行中的最后一个字符是否为a-,然后删除它并在检查单词之前将两行连接在一起注意:如果您使用的是.NET 4.0,则可以使用File.ReadLines(filename),而不必编写AsLines方法。@ICR:很好,我在2008年针对.NET3.5编写并测试了这篇文章。这篇文章能处理在连续行中拆分的情况吗?我也考虑过这一点。。。但是,如果文件中有类似“barf oogle”的内容,就会出现问题。为什么输入文件中会有一个刹车?其中“f”在一行,而“oo”是下一行的开始?我真的不认为foo是他真正要寻找的词。我的观点是,如果你做一个.Replace(“,”),它会将所有单词连接在一起。用一些检查逻辑更新代码,看看上一行的结尾+新行的开头是否修剪=模式。以及使用正则表达式,因为这是解决方案中要求的。我知道正则表达式的位置不是最优的,但是当@toto知道他想如何使用它时,他可以进行调整。我在while条件中更改了第一行,因为如果该行只有一个单词,这个解决方案对我不起作用。相反,我使用了这两行:
intend=(input.IndexOf(“”==-1)?input.Length:input.IndexOf(“”);第一个字=输入。子字符串(0,结束)。谢谢你的解决方案!这是一个很好的观点。要使用我上面的示例,您可以在每行的开头和结尾添加一个空格,然后执行.Contains(“foo”)