如何将部分字符串与其他字符串匹配

时间:2019-07-10 09:17:15

标签: c# regex string

我有2个字符串,我需要同时匹配两个字符串。 它有点棘手,因为字符串的最后一部分应与另一个字符串的第一部分匹配。

我尝试使用string.Contains()方法,但未成功,因为两个字符串中都可以有n个子文件夹

示例:

var string1 = @"C:/GII/gii_db/DownTime/EMEA";
var string2 = @"DownTime/EMEA/APPS_GLOBAL/Tables/XXG_CHUB_ADDRESS_T.SQL";

这两个字符串中的部分 DownTime / EMEA 应该匹配。

7 个答案:

答案 0 :(得分:3)

从我的POV中,您可以使用string.Contains

您可以询问Downtime/EMEA是否在两个字符串中。

如果我错了,请看下面的代码。

var string1 = @"C:/GII/gii_db/DownTime/EMEA";
var string2 = @"DownTime/EMEA/APPS_GLOBAL/Tables/XXG_CHUB_ADDRESS_T.SQL";

if (!string1.Contains("/DownTime/EMEA") && string2.Contains("/DownTime/EMEA"))
{
    Console.WriteLine("Not Matched");
}
else
{
    Console.WriteLine("Matched");
}

Console.ReadKey();

答案 1 :(得分:2)

这对我有用:

var string1 = @"C:/GII/gii_db/DownTime/EMEA";
var string2 = @"DownTime/EMEA/APPS_GLOBAL/Tables/XXG_CHUB_ADDRESS_T.SQL";

bool is_match =
    Enumerable
        .Range(1, (string1.Length < string2.Length ? string1.Length : string2.Length) - 1)
        .Any(x => string1.Substring(string1.Length - x) == string2.Substring(0, x));
在此示例中,

is_matchtrue


一种稍微简单但效率较低的解决方案:

bool is_match =
    Enumerable
        .Range(1, string1.Length)
        .Any(x => string2.StartsWith(string1.Substring(string1.Length - x)));

答案 2 :(得分:0)

我现在无法提供代码,但可以通过以下一种可能的解决方案:

  1. 将字符串拆分为“ /”以获取各个部分(我们称它们为“令牌”)
  2. 检查string1是否包含string2的第一个令牌。跟踪位置。
  3. 向前移动string1,检查下一个令牌是否等于string2的第二个令牌
  4. 保持比较标记,如果您持续匹配并到达任一字符串的末尾,则您有匹配项

答案 3 :(得分:0)

简单:

{
     string string1 =  "C:/GII/gii_db/DownTime/EMEA";
     string string2 = "DownTime/EMEA/APPS_GLOBAL/Tables/XXG_CHUB_ADDRESS_T.SQL";
     string[] splitStr1 = string1.Split(new char[] { '/' });
     string[] splitStr2 = string2.Split(new char[] { '/' });

     if ((splitStr1[splitStr1.Length - 2] == splitStr2[0]) && (splitStr1[splitStr1.Length - 1] == splitStr2[1]))
     {
         Console.WriteLine("Matched");
     }

答案 4 :(得分:0)

public static class StringExtensions
{
    public static bool EndIsTheBegginingOf(this string s1, string s2)
    {
        for (int i = s1.Length - 1; i >= 0; i--)
        {
            var part = s1.Substring(i);
            if (s2.StartsWith(part)) return true;
        }

        return false;
    }
}

用法:

var s1 = @"C:/GII/gii_db/DownTime/EMEA";
var s2 = @"DownTime/EMEA/APPS_GLOBAL/Tables/XXG_CHUB_ADDRESS_T.SQL";
var res = s1.EndIsTheBegginingOf(s2); // true

s2 = @"DownT/ime/EMEA/APPS_GLOBAL/Tables/XXG_CHUB_ADDRESS_T.SQL";
res = s1.EndIsTheBegginingOf(s2); // false

答案 5 :(得分:0)

这是您想要的吗,您可以尝试一下
//find a string which is end with string1 and start with string2
      static void Main(string[] args)
        {
            var string1 = @"C:/GII/gii_db/DownTime/EMEA";
            var string2 = @"DownTime/EMEA/APPS_GLOBAL/Tables/XXG_CHUB_ADDRESS_T.SQL";
            string result = "";

            int length = string1.Length;
            int index = 1;
            for (int i = 0; i < length; i++)
            {
                string temp = string1.Substring(length - i - 1, index++);

                if (string2.StartsWith(temp))
                {
                    result = temp;
                }
                Console.WriteLine(temp);
            }

            Console.WriteLine($"result:{result}");

            ReadLine();
        }

答案 6 :(得分:0)

您可以编写一些代码,将两个序列分为“ xxxxxx / xxxxxx”形式的双字母组,其中xxxxx是字母和下划线的序列。然后,您可以比较为每个字符串找到的匹配项。以下正则表达式代码与两个字符串中的都匹配。然后只需比较从所有字符串中找到的所有匹配项即可。

(DownTime/EMEA)*/*(EMEA/APPS_GLOBAL)*/*(APPS_GLOBAL/Tables)*/*(Tables/XXG_CHUB_ADDRESS_T\.SQL)*/*

假设您已首先将字符串拆分成上述格式,那么您应该一切顺利。