Я думаю, что это связано с тем, что, когда сравнение «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
, потому что интерпретатор не использовал тот же объект, что и я, один ', если бы я сделал это, это сделало бы их одним и тем же объектом.
Я придумал это решение. Идея состоит в том, чтобы удалить цитаты из направляющих, которые имеют кавычки. Затем добавьте цитаты ко всем (голым) гидам. Если есть какое-то другое решение, которое может найти точный 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();
}
}
}
Вы можете сопоставить 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}'"
переносит совпадение с '
с, если оно еще не было заключено в одинарные кавычки.