146

文字列を解析し、各 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-454b-ac6f-9fec00b8e170 [タイプ: Guid (0)"

4

6 に答える 6

218

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

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)\))$

ソリューションは、必要に応じて必要なものをより明確に示すために、数字のみに一致するように単純化されています。

于 2012-06-14T20:37:36.033 に答える
59

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

(^([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})$) 

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

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

于 2016-02-26T09:42:43.850 に答える
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 が返されます。

于 2012-06-28T10:25:00.210 に答える
8

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

それは無料です。

これが私がやった方法です:

ここに画像の説明を入力

次に、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);
于 2014-03-27T16:12:28.490 に答える