如何在字符串中找到两个引号

3

我正在尝试搜索一个文件并查看是否有任何一行包含单词Description1,而且如果在该特定行中出现两个引号直接紧挨着的情况。

我已经找到了各种删除或替换它们的方法,但我想保留它们。

foreach (var line in File.ReadLines(FileName))
   {
    if (line.Contains ("Description1") )
       {
        MessageBox.Show ("Description1 found");

           if (line.Contains (@"""") )
              {                                                 
               MessageBox.Show ("ERROR! Empty Description1 found.");
              }
        }
}

所搜索的文件看起来类似于这样:

 propertyDescriptor="22004" PropertyName="Description1" PropertyType="Part" PropertyValue="Cat"   
 propertyDescriptor="22004" PropertyName="Description1" PropertyType="Part" PropertyValue=""   
 propertyDescriptor="22006" PropertyName="Description2" PropertyType="Part" PropertyValue=""   

错误检查应该只检测第二行,即同时存在Description1和两个引号的行。

我的问题是我在每个Description1文本实例中都遇到了一个错误。

有好的想法吗?

提前感谢。


所以你想要解析代码能够处理 PropertyValue 中的空字符串?看起来很简单,因为在 .NET 中 "" 是一个有效的字符串。你只需要确保在处理输入之前通过 IsNullOrWhitespace() 运行一下即可。也许你甚至想将这些空字符串替换为 NULL,以使后续处理更容易。 - Christopher
你上面的代码没有考虑到你感兴趣的令牌的顺序。我建议使用类似于string.Split()(可能甚至是嵌套的)来编写更好的解析器。 - David J
“Contains”对于你想要做的事情来说太过强大了。相反,看看“IndexOf” - 它有超载函数,可以让你从字符串中特定的偏移量(例如上一个搜索结果)开始搜索。 - 500 - Internal Server Error
1
我会检查 line.Contains("PropertyName="Description1"") 和 line.Contains("PropertyValue=""")。 - Sir Rufo
1
顺便提一下,line.Contains(@"""") 和 line.Contains(""") 是相同的。 - Sir Rufo
显示剩余6条评论
2个回答

6

使用line.Contains("\"\"")替代line.Contains(@""""),因为line.Contains(@"""")会搜索 " 而不是 ""。

在你的代码中进行替换:

foreach (var line in File.ReadLines(FileName))
{
    if (line.Contains ("Description1") )
    {
        MessageBox.Show ("Description1 found");

        if (line.Contains ("\"\"") )
        {                                                 
            MessageBox.Show ("ERROR! Empty Description1 found.");
        }
    }
}

1
@DavidJulitz 如果按照所述进行替换,则可以编译。顺便提一下,也可以使用line.Contains(@"""""") - Ian
它确实可以,请检查一下 @David Julitz - Tomas Chabada
可以使用 @"""""" 或者 "\"\"" - 在一个带有 @ 的逐字字符串字面量中,你需要将 " 转义为两个引号,而 \ 只是一个反斜杠,在一个普通的字符串字面量中,你需要用反斜杠转义引号。 - Hans Kesting
@DavidJulitz 是的,你说得对,可能应该查找 line.Contains("PropertyValue=\"\"") - Ian
@TomasNordström 请考虑将此答案标记为正确答案。 - Tomas Chabada

0

由于输入文本看起来很像有效的XML属性,我建议尝试将其解析为XML,这可能会有所帮助。

请尝试以下操作:

var errors =
    File
        .ReadLines(FileName)
        .Select(x => $"<root {x} />")
        .Select(x => XDocument.Parse(x))
        .Where(x => x.Root.Attribute("PropertyName").Value == "Description1")
        .Where(x => x.Root.Attribute("PropertyValue").Value == "")
        .ToArray();

在您的样本数据中,这对我产生了以下结果:
<root propertyDescriptor="22004" PropertyName="Description1" PropertyType="Part" PropertyValue="" />

你肯定可以尝试调整这个相当简洁的查询,以便输出你想要的消息。


@DavidJulitz - 我逐字复制了提供的数据并保存在文本文件中。 完全匹配。 - Enigmativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接