为了账号安全,请及时绑定邮箱和手机立即绑定

使用正则表达式在 C# 中用单引号将 GUID 括起来

使用正则表达式在 C# 中用单引号将 GUID 括起来

C#
回首忆惘然 2022-07-23 16:52:21
GUID 可以出现在带有或不带有单引号的语句中,例如string inputString = @"ObjectID='{A591C480-2979-48ED-9796-5C3149472E7A}' and ObjectID={90f0fb85-0f80-4466-9b8c-2025949e2079}";我的要求是:如果 GUID 用单引号括起来,请跳过它。如果它没有用单引号括起来,则用单引号括起来。我期待输出像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", "'$0'", RegexOptions.IgnoreCase);不幸的是,这个发现所有 GUID 都在单引号内并且没有单引号。replace 方法最终将围绕 guid 已经有多个单引号的单引号。您能否帮我找到不在单引号内的 GUID。然后用单引号括起来。
查看完整描述

3 回答

?
慕盖茨4494581

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 包装匹配项。'


查看完整回答
反对 回复 2022-07-23
?
狐的传说

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如果字符串在开头或结尾只有一个撇号,我添加了调用。


查看完整回答
反对 回复 2022-07-23
?
互换的青春

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();

        }

    }

}

//img1.sycdn.imooc.com//62dbb6f40001de7b09830131.jpg

查看完整回答
反对 回复 2022-07-23
  • 3 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信