GuidのC#正規表現


121

文字列を解析して、各Guid値を一重引用符で囲む必要があります。私はこれを行うために正規表現を使用できると考えていましたが、私は正規表現の第一人者ではありません。

Guidを識別するために使用する良い正規表現はありますか?

私の2番目の質問は、使用すると想定している有効な正規表現を見つけたらRegex.Replace(String, String, MatchEvaluator)、構文がよくわかりません。多分次のようなもの:

return Regex.Replace(stringToFindMatch, GuidRegex, match =>
{
    return string.Format("'{0}'", match.Groups[0].ToString());
});

解析しようとしている文字列は次のようになります。

"SELECT passwordco0_.PASSWORD_CONFIG_ID as PASSWORD1_46_0_、FROM PASSWORD_CONFIG passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p0 = baf04077-a3c0-454f-acb6c0e454c-e6c0e454f-acb6e0c0e454f-acb6e6e9e9e9e0e9e9e9e0e0e0e0e0e0e9e0e0e0e0e0e0e0e0e0e1e1e3e0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee


5
それはSQLであり、SQLパラメータを使用する必要があります。
jrummell 2012年

2
なぜREgexを使用するのですか?GUID.IsGUid
Micah Armantroutが

実際にはパラメータがありますが、where句の値と同じです。これはどこから来たのですか?プロファイラー?
jrummell 2012年

@jrummellこれはプロファイラーから来ています。出力をコピーして貼り付け、SQL Management Studioで実行できるように出力を変換しようとしています。これはログの記録のみを目的としています。パラメータ化されたSQLとして実行されます。
Cole W

1
出ていた間違った私にゲスmsdn.microsoft.com/en-us/library/...
ミカArmantrout

回答:


182

これは非常にシンプルで、あなたが言うようにデリゲートを必要としません。

resultString = Regex.Replace(subjectString, 
     @"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$", 
     "'$0'");

これは次のスタイルと一致します。これらのスタイルはすべて、GUIDの同等で許容可能な形式です。

ca761232ed4211cebacd00aa0057b223
CA761232-ED42-11CE-BACD-00AA0057B223
{CA761232-ED42-11CE-BACD-00AA0057B223}
(CA761232-ED42-11CE-BACD-00AA0057B223)

アップデート1

@NonStaticは、上記の正規表現が誤った終了区切り文字を持つ誤検知に一致することをコメントで指摘しています。

これは、広くサポートされている正規表現条件によって回避できます。

条件文は、JGsoftエンジン、Perl、PCRE、Python、および.NETフレームワークでサポートされています。Rubyはそれらをバージョン2.0以降でサポートしています。PCREに基づく正規表現機能を持つDelphi、PHP、Rなどの言語も条件文をサポートしています。(ソースhttp://www.regular-expressions.info/conditional.html

次の正規表現が一致します

{123}
(123)
123

そして、一致しません

{123)
(123}
{123
(123
123}
123)

正規表現:

^({)?(\()?\d+(?(1)})(?(2)\))$

必要に応じて何が必要であるかをより明確な方法で示すために、ソリューションは数値のみに一致するように簡略化されています。


書かれているように、これはすべての有効なタイプのGUID(したがって更新)に対しては機能しませんでした。
senfo 2015

4
これは、有効なケースである小文字を考慮していません。^ [{|(]?[0-9a-fA-F] {8} [-]?([0-9a-fA-F] {4} [-]?){3} [0-9a- fA-F] {12} [)|}]?$または/ iフラグを使用
Michael Brown

@MichaelBrown大文字と小文字を区別せずに一致します。コードサンプルのRegexOptions.IgnoreCaseを参照してください。
Buckley 2016

1
正規表現では、4未満のマイナス記号も使用できます。これを気にする人のためのファイ。気にしない人のために、ここではより多くの偽陽性を可能にする単純な正規表現は、次のとおりです[0-9a-fA-F\-]{32,36}
USR

1
動作しないhttps://support.office.com/en-us/article/poisson-function-d81f7294-9d7c-4f75-bc23-80aa8624173a
zmechanic

40

最も基本的な正規表現は次のとおりです。

(^([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$) 

または、ここに貼り付けることもできます

これにより時間を節約できることを願っています。


推奨される回答ほど完全ではありませんが、regex101.comリンクの+1です。
ジムビリグ

4
繰り返しを削除しました:[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}ダッシュはオプションにすることができます:[0-9A-Fa-f]{8}-?([0-9A-Fa-f]{4}-?){3}[0-9A-Fa-f]{12}
Louis Somers

16

C#.Netが、指定されたテキストからguidに見える文字列を見つけて置き換えるには、

このRegExを使用します。

[({]?[a-fA-F0-9]{8}[-]?([a-fA-F0-9]{4}[-]?){3}[a-fA-F0-9]{12}[})]?

C#コードの例:

var result = Regex.Replace(
      source, 
      @"[({]?[a-fA-F0-9]{8}[-]?([a-fA-F0-9]{4}[-]?){3}[a-fA-F0-9]{12}[})]?", 
      @"${ __UUID}", 
      RegexOptions.IgnoreCase
);

確かに動作します!また、次のスタイルと一致して置き換えられます。これらのスタイルはすべて、GUIDの同等で許容可能な形式です。

"aa761232bd4211cfaacd00aa0057b243" 
"AA761232-BD42-11CF-AACD-00AA0057B243" 
"{AA761232-BD42-11CF-AACD-00AA0057B243}" 
"(AA761232-BD42-11CF-AACD-00AA0057B243)" 

3
受け入れられた答えは私にとってはうまくいきませんでしたが、これはうまくいきました!
Merin Nakarmi

ここで1つの問題。GUIDには16進数のみが含まれます。したがって、azとAZからの文字は受け入れられず、afとAFのみが受け入れられます。それ以外の場合は、32文字のテキストを有効なGuidとして受け入れます。
Merin Nakarmi

8

.NET Framework 4には拡張System.Guid構造があり、GUIDを解析するための新しいTryParseメソッドとTryParseExactメソッドが含まれています。これの例です。

    //Generate New GUID
    Guid objGuid = Guid.NewGuid();
    //Take invalid guid format
    string strGUID = "aaa-a-a-a-a";

    Guid newGuid;

    if (Guid.TryParse(objGuid.ToString(), out newGuid) == true)
    {
        Response.Write(string.Format("<br/>{0} is Valid GUID.", objGuid.ToString()));
    }
    else
    {
        Response.Write(string.Format("<br/>{0} is InValid GUID.", objGuid.ToString()));
    }


    Guid newTmpGuid;

    if (Guid.TryParse(strGUID, out newTmpGuid) == true)
    {
        Response.Write(string.Format("<br/>{0} is Valid GUID.", strGUID));
    }
    else
    {
        Response.Write(string.Format("<br/>{0} is InValid GUID.", strGUID));
    }

この例では、新しいguidオブジェクトを作成し、無効なguidを持つ1つの文字列変数を取得します。その後、TryParseメソッドを使用して、両方の変数が有効なGUID形式であるかどうかを検証します。例を実行すると、文字列変数が有効なguid形式ではなく、「InValid guid」というメッセージが表示されることがわかります。文字列変数に有効なGUIDがある場合、これはTryParseメソッドでtrueを返します。


7
問題は、GUIDを検証するのではなく、長い文字列からGUIDを検索/抽出する方法を尋ねることでした。この回答を削除することを提案します。
コーディング終了

13
@Micah Armantrout:「良い」回答かもしれませんが、この質問に対する回答ではありません。答えを好きな場所に置いただけでは、StackOverflowの目的に反します:)
Gone Coding

8
まあ、「guidの正規表現」を検索する私のような人にとって、この答えは本当に最も役に立ちました-私は本当に正規表現を必要としませ。GUIDを照合する必要があります。このページは「正規表現を検出する」の最初の結果です現在、Googleでguid」と表示されています。
Dan Field

3
@ダンフィールドの出向。私はguidの正規表現を検索するためにここに来て、この答えが本当に欲しかったものであることがわかりました。StackOverflowの目的はこうして達成されました。
JLScott

これは関連する答えではありませんが、もちろん役に立ちます。私から一票。:)
Merin Nakarmi

8

C#コードは、http//regexhero.net/tester/を使用して簡単に自動生成できます。

それは無料です。

ここに私がそれをした方法があります:

ここに画像の説明を入力してください

次に、Webサイトは.NETコードを自動生成します。

string strRegex = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"     {CD73FAD2-E226-4715-B6FA-14EDF0764162}.Debug|x64.ActiveCfg =         Debug|x64";
string strReplace = @"""$0""";

return myRegex.Replace(strTargetString, strReplace);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.