3 回答

TA貢獻1850條經驗 獲得超11個贊
您可以匹配單引號內的 GUID 并捕獲它,以便能夠測試該組以在匹配評估器內進行匹配,并在將用單引號括起來的所有其他上下文中匹配 GUID:
var inputString = @"ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID={90f0fb85-0f80-4466-9b8c-2025949e2079}";
var guid = @"[({]?\s?[a-zA-Z0-9]{8}\s?[-]?\s?(?:[a-zA-Z0-9]{4}\s?[-]?\s?){3}\s?[a-zA-Z0-9]{12}\s?[})]?";
inputString = Regex.Replace(inputString, $@"('{guid}')|{guid}", x =>
x.Groups[1].Success ? x.Value : $"'{x.Value}'");
Console.WriteLine(inputString);
// => ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID='{90f0fb85-0f80-4466-9b8c-2025949e2079}'
請參閱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}'"行僅用 s 包裝匹配項。'

TA貢獻1804條經驗 獲得超3個贊
如果不需要 Regex,為什么不使用簡單的方法呢?
void Main()
{
string ObjectID="'{A591C480-2979-48ED-9796-5C3149472E7A}'";
if (!(ObjectID.StartsWith("'") && ObjectID.EndsWith("'")))
{
ObjectID = $"'{ObjectID.Trim('\'')}'";
}
Console.WriteLine(ObjectID);
}
Trim如果字符串在開頭或結尾只有一個撇號,我添加了調用。

TA貢獻1797條經驗 獲得超6個贊
我想出了這個解決方案。這個想法是從有引號的 Guid 中刪除引號。然后為所有(裸)Guid 添加引號。如果有任何其他解決方案可以找到沒有單引號的精確 Guid 并使用純正則表達式用單引號括起來,我會接受它作為答案。
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", "'$0'", RegexOptions.IgnoreCase);
Console.WriteLine("\nAfter: ");
Console.WriteLine(inputString);
Console.ReadLine();
}
}
}
- 3 回答
- 0 關注
- 193 瀏覽
添加回答
舉報