Окружить GUID одинарными кавычками в C # с помощью Regex

Я думаю, что это связано с тем, что, когда сравнение «is» оценивается как false, используются два разных объекта. Если он оценивает значение true, это означает, что внутри он использует один и тот же точный объект, а не создает новый, возможно, потому, что вы создали их за долю в 2 или около того секунд и потому, что между ним нет большого промежутка времени и использует тот же объект.

Вот почему вы должны использовать оператор равенства ==, а не is, чтобы сравнить значение строкового объекта.

>>> s = 'one'
>>> s2 = 'two'
>>> s is s2
False
>>> s2 = s2.replace('two', 'one')
>>> s2
'one'
>>> s2 is s
False
>>> 

В этом примере я сделал s2, который был другим строковым объектом, ранее равным «одному», но это не тот же объект, что и s, потому что интерпретатор не использовал тот же объект, что и я, один ', если бы я сделал это, это сделало бы их одним и тем же объектом.

1
задан Alessio Cantarella 15 January 2019 в 22:20
поделиться

2 ответа

Я придумал это решение. Идея состоит в том, чтобы удалить цитаты из направляющих, которые имеют кавычки. Затем добавьте цитаты ко всем (голым) гидам. Если есть какое-то другое решение, которое может найти точный Guid без одинарных кавычек и окружить его одинарными кавычками, используя чистый Regex, я бы принял это как ответ.

using System;
using System.Text.RegularExpressions;

namespace RegexTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string inputString = @"ObjectID = '{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID = { 90f0fb85 - 0f80 - 4466 - 9b8c - 2025949e2079 }";
            Console.WriteLine("Before: ");
            Console.WriteLine(inputString);

            var quotedGuidMatches = Regex.Matches(inputString, @"'[({]?\s?[a-zA-Z0-9]{8}\s?[-]?\s?([a-zA-Z0-9]{4}\s?[-]?\s?){3}\s?[a-zA-Z0-9]{12}\s?[})]?'");

            var guidMatches = Regex.Matches(inputString, @"\b[({]?\s?[a-zA-Z0-9]{8}\s?[-]?\s?([a-zA-Z0-9]{4}\s?[-]?\s?){3}\s?[a-zA-Z0-9]{12}\s?[})]?\b");

            //First eliminate single quotes from guoted guids
            foreach(var quotedGuid in quotedGuidMatches)
            {
                inputString = inputString.Replace(quotedGuid.ToString(), quotedGuid.ToString().Trim('\''));
            }            

            //After single quotes have been eliminated from guids, surround all naked guids with single quotes
            inputString = Regex.Replace(inputString, @"\b[({]?\s?[a-zA-Z0-9]{8}\s?[-]?\s?([a-zA-Z0-9]{4}\s?[-]?\s?){3}\s?[a-zA-Z0-9]{12}\s?[})]?\b", "'[110]'", RegexOptions.IgnoreCase);

            Console.WriteLine("\nAfter: ");
            Console.WriteLine(inputString);

            Console.ReadLine();
        }
    }
}

enter image description here

0
ответ дан Merin Nakarmi 15 January 2019 в 22:20
поделиться

Вы можете сопоставить GUID в одинарных кавычках и захватить его, чтобы иметь возможность проверить эту группу на соответствие в оценщике совпадений и сопоставить GUID во всех других контекстах, которые будут заключены в одинарные кавычки:

[110 ]

См. Демонстрацию C # .

Заметьте, что я сделал группу захвата ([a-zA-Z0-9]{4}\s?[-]?\s?) в исходном шаблоне без захвата, (?:[a-zA-Z0-9]{4}\s?[-]?\s?).

Строковый литерал $@"('{guid}')|{guid}" создает регулярное выражение, подобное

('[({]?\s?[a-zA-Z0-9]{8}\s?[-]?\s?(?:[a-zA-Z0-9]{4}\s?[-]?\s?){3}\s?[a-zA-Z0-9]{12}\s?[})]?')|[({]?\s?[a-zA-Z0-9]{8}\s?[-]?\s?(?:[a-zA-Z0-9]{4}\s?[-]?\s?){3}\s?[a-zA-Z0-9]{12}\s?[})]?

Первая альтернатива сопоставляет и захватывает GUID внутри одинарных кавычек в Группе 1, а вторая альтернатива сопоставляет GUID в других контекстах. Строка x => x.Groups[1].Success ? x.Value : $"'{x.Value}'" переносит совпадение с ' с, если оно еще не было заключено в одинарные кавычки.

0
ответ дан Wiktor Stribiżew 15 January 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: