【问题标题】:Compare two strings by ignoring certain substrings通过忽略某些子字符串来比较两个字符串
【发布时间】:2015-09-17 14:57:00
【问题描述】:

我正在开发一个比较工具来比较两行文本字符串。条件是,我需要获取子字符串的某个部分并忽略它进行比较。例如

两行

文件 = .test\testfile CRC = 0x0987678 日期 = 10/09/2015 版本 = 1

文件 = .test\testfile CRC = 0x0984567 日期 = 11/09/2015 版本 = 1

如果两个过滤器作为 CRC 和 DATE 提供,那么我需要忽略完整的字段和值。因此 CRC = 0x0987678 DATE = 10/09/2015 将被忽略以进行比较,并且只会比较字符串的其余部分在上述情况下将返回 true,因为字符串的其余部分是相同的。

现在我可以通过搜索字符串、删除空格、获取值等来做到这一点,但我正在寻找带有正则表达式的解决方案来优化我的解决方案。谢谢。

【问题讨论】:

  • 你试过正则表达式了吗?如果是这样,您尝试过什么?
  • 我建议要么使用一些数据预处理来获得字符串的“标准化”表示,这是通过删除不相关的部分生成的,或者编写一个比较函数来执行此操作即时。是什么让您认为正则表达式能更好地做到这一点?
  • 我还没有尝试过正则表达式,但只是认为它会是一种更好的方法,因为我还没有探索过这个实用程序在 c# 中的潜力。会尝试一下,但欢迎提出任何建议,这包括不使用正则表达式并采用传统方法。
  • 好的,我只想知道,如果有这样的字符串:"File = .test\testfile CRC = 0x0984567 DATE = 11/09/2015 VERSION = 1" 并想将其与通过忽略字符串的某些部分来创建另一个字符串,有没有一种有效的方法来做到这一点?

标签: c#


【解决方案1】:

这个问题有两个部分。首先获取参数。其次是做过滤。正则表达式是第一部分的最佳解决方案。过滤可以通过许多不同的方式完成。这是正则表达式部分。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "FILE = .test\testfile CRC = 0x0987678 DATE = 10/09/2015 VERSION = 1";
            string pattern = @"(?'name'[\w]+)\s+=\s+(?'value'[^\s]+)";

            Regex expr = new Regex(pattern);
            MatchCollection matches = expr.Matches(input);

            Dictionary<string, string> dict = new Dictionary<string, string>();
            foreach (Match match in matches)
            {
                dict.Add(match.Groups["name"].Value, match.Groups["value"].Value);
            }
        }
    }
}​

【讨论】:

  • 可以很好地拆分,但字符串中会有一些情况,例如:END FILE 和 XYZ FILE = "....."。我们可以修改正则表达式模式吗?例如TW FILES XYZ FILE = "/test/test files" VERSION = 1 CRC = 0xFFFFFFFF END TW FILES
  • 该模式只查找等号前后的单词,而忽略其他所有内容。
  • 好的,我只想知道,如果有这样的字符串:"File = .test\testfile CRC = 0x0984567 DATE = 11/09/2015 VERSION = 1" 并想将其与通过忽略字符串的某些部分来创建另一个字符串,有没有一种有效的方法来做到这一点?
  • 这两个字符串可能有不同的间距和不同的顺序,一个可能缺少一个片段。最好的方法就像我所做的那样,将一个放入字典中,然后将第二个的每个片段与第一个进行比较。
  • 想一想,你可以使用 Linq Outer Join 将两个字符串按每个片段的名称连接起来。请参阅以下网页:code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b 外连接将给出空值,其中第二个字符串缺少不在第一个字符串中的项目。常规连接只会给出第一个字符串中的所有项目和第二个字符串中匹配的项目(不给出不匹配的项目)。
猜你喜欢
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
相关资源
最近更新 更多