Как сопоставить часть строки с другой строкой - PullRequest
1 голос
/ 10 июля 2019

У меня есть 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 ]

2 голосов
/ 10 июля 2019

Это работает для меня:

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_match в этом примере true.


Несколько более простое, но менее эффективное решение:

bool is_match =
    Enumerable
        .Range(1, string1.Length)
        .Any(x => string2.StartsWith(string1.Substring(string1.Length - x)));
0 голосов
/ 10 июля 2019

Вы могли бы написать некоторый код, который разбивает две последовательности на биграммы в форме «xxxxxx / xxxxxx», где xxxxx - это последовательность букв и подчеркиваний. Затем вы можете сравнить найденные совпадения для каждой строки. Следующий код регулярного выражения соответствует тому, что вы хотите в обеих строках. Затем нужно сравнить все найденные совпадения по всем имеющимся у вас строкам:

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

Предположим, что вы сначала разбили строки на формат, упомянутый выше, вам будет хорошо.

0 голосов
/ 10 июля 2019
Это то, что вы хотите, вы можете попробовать
//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();
        }
0 голосов
/ 10 июля 2019

Из моего 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();
0 голосов
/ 10 июля 2019
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
0 голосов
/ 10 июля 2019

Легко:

{
     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");
     }
0 голосов
/ 10 июля 2019

Я не могу предоставить код прямо сейчас, но я могу найти одно из возможных решений:

  1. Разделить строки на '/', чтобы получить части (назовем их "жетоны")
  2. Проверьте, содержит ли string1 первый токен string2. Следите за позициями.
  3. Продвиньтесь в string1, проверьте, равен ли следующий токен второму токену string2
  4. Продолжайте сравнивать токены, если вы продолжаете сопоставлять и достигаете конца любой строки, у вас есть совпадение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...