使用正则表达式在 C# 中用单引号括起 GUID
Surround a GUID with single quotes in C# using Regex
GUID 可以出现在带或不带单引号的语句中,例如
string inputString = @"ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID={90f0fb85-0f80-4466-9b8c-2025949e2079}";
我的要求是:
If a GUID is surrounded by single quotes, skip it.
If it is not surrounded by single quotes, then surround it with single quotes.
我希望输出像
inputString = @"ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID='{90f0fb85-0f80-4466-9b8c-2025949e2079}'"
或
inputString = @"ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID={'90f0fb85-0f80-4466-9b8c-2025949e2079'}"
在单引号内查找 GUID 的正则表达式是
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?[})]?'");
查找 GUID 的正则表达式是
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");
用单引号包围 guid 的正则表达式是
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", "'[=15=]'", RegexOptions.IgnoreCase);
不幸的是,这个发现所有 GUID 都在单引号内并且没有单引号。 replace 方法将最终围绕已经具有多个单引号的单引号的 guid。
你能帮我找到不在单引号内的 GUID 吗?然后用单引号括起来。
如果不需要正则表达式,为什么不使用简单的方法呢?
void Main()
{
string ObjectID="'{A591C480-2979-48ED-9796-5C3149472E7A}'";
if (!(ObjectID.StartsWith("'") && ObjectID.EndsWith("'")))
{
ObjectID = $"'{ObjectID.Trim('\'')}'";
}
Console.WriteLine(ObjectID);
}
我添加了对 Trim
的调用,以防字符串在开头或结尾只有一个撇号。
您可以在单引号内匹配 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# demo。
注意我在原始模式中将 ([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 包装匹配项,前提是它尚未用单引号引起来。
我想到了这个解决方案。这个想法是从有引号的 Guids 中删除引号。然后为所有(裸)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", "'[=10=]'", RegexOptions.IgnoreCase);
Console.WriteLine("\nAfter: ");
Console.WriteLine(inputString);
Console.ReadLine();
}
}
}
GUID 可以出现在带或不带单引号的语句中,例如
string inputString = @"ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID={90f0fb85-0f80-4466-9b8c-2025949e2079}";
我的要求是:
If a GUID is surrounded by single quotes, skip it.
If it is not surrounded by single quotes, then surround it with single quotes.
我希望输出像
inputString = @"ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID='{90f0fb85-0f80-4466-9b8c-2025949e2079}'"
或
inputString = @"ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID={'90f0fb85-0f80-4466-9b8c-2025949e2079'}"
在单引号内查找 GUID 的正则表达式是
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?[})]?'");
查找 GUID 的正则表达式是
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");
用单引号包围 guid 的正则表达式是
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", "'[=15=]'", RegexOptions.IgnoreCase);
不幸的是,这个发现所有 GUID 都在单引号内并且没有单引号。 replace 方法将最终围绕已经具有多个单引号的单引号的 guid。
你能帮我找到不在单引号内的 GUID 吗?然后用单引号括起来。
如果不需要正则表达式,为什么不使用简单的方法呢?
void Main()
{
string ObjectID="'{A591C480-2979-48ED-9796-5C3149472E7A}'";
if (!(ObjectID.StartsWith("'") && ObjectID.EndsWith("'")))
{
ObjectID = $"'{ObjectID.Trim('\'')}'";
}
Console.WriteLine(ObjectID);
}
我添加了对 Trim
的调用,以防字符串在开头或结尾只有一个撇号。
您可以在单引号内匹配 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# demo。
注意我在原始模式中将 ([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 包装匹配项,前提是它尚未用单引号引起来。
我想到了这个解决方案。这个想法是从有引号的 Guids 中删除引号。然后为所有(裸)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", "'[=10=]'", RegexOptions.IgnoreCase);
Console.WriteLine("\nAfter: ");
Console.WriteLine(inputString);
Console.ReadLine();
}
}
}