Guid 용 C # Regex


121

문자열을 구문 분석하고 각 Guid 값 주위에 작은 따옴표를 추가해야합니다. 나는 정규식을 사용하여 이것을 할 수 있다고 생각했지만 정확히 정규식 전문가는 아닙니다.

Guid를 식별하는 데 사용할 수있는 좋은 정규식이 있습니까?

두 번째 질문은 유효한 정규식을 찾았다면 사용할 것이라고 가정 Regex.Replace(String, String, MatchEvaluator)하지만 구문이 확실하지 않습니다. 아마도 다음과 같습니다.

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

구문 분석하려는 문자열은 다음과 같습니다.

"PASSWORD1_46_0_에서 passwordco0_.PASSWORD_CONFIG_ID를 PASSWORD_CONFIG에서 passwordco0_ WHERE passwordco0_.PASSWORD_CONFIG_ID = baf04077-a3c0-454b-ac6f-9fec00b8e170; @ p0 = baf04077-a3c0-4540b-ac6f-9fec00b8e170으로 선택합니다.


5
이것이 SQL이고 SQL 매개 변수를 사용해야합니다.
jrummell

2
당신이 정규식을 사용하는 이유는 GUID.IsGUid이
미가 Armantrout

실제로 매개 변수가 있지만 where 절의 값과 동일합니다. 이게 어디서 오는거야? 프로파일 러?
jrummell

@jrummell 이것은 프로파일 러에서 나온 것입니다. 복사하여 붙여넣고 SQL Management Studio에서 실행할 수 있도록 출력을 변환하려고합니다. 이것은 로깅 목적으로 만 사용됩니다. 매개 변수화 된 SQL로 계속 실행됩니다.
Cole W

답변:


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 dec

4
이것은 유효한 대소 문자가 될 소문자를 고려하지 않습니다. ^ [{| (]? [0-9a-fA-F] {8} [-]? ([0-9a-fA-F] {4} [-]?) {3} [0-9a- fA-F] {12} [) |}]? $ 또는 / i 플래그 사용
Michael Brown

@MichaelBrown 대소 문자를 구분하지 않고 일치합니다. 코드 샘플의 RegexOptions.IgnoreCase를 참조하십시오.
버클리

1
정규식은 또한 4 개 미만의 마이너스 기호를 허용합니다. 이것에 관심이있는 사람들을위한 Fyi. 신경 쓰지 않는 사람들을 위해 더 많은 오탐을 허용하는 더 간단한 정규식이 있습니다 [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입니다.
Jim Billig

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

여기에 한 가지 문제가 있습니다. Guid에는 16 진수 만 포함됩니다. 따라서 az 및 AZ의 문자는 허용되지 않고 af 및 AF 만 허용됩니다. 그렇지 않으면 유효한 Guid로 32 자의 텍스트를 허용합니다.
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를 가진 하나의 문자열 변수를 취합니다. 그런 다음 TryParse 메서드를 사용하여 두 변수가 모두 유효한 GUID 형식을 가지고 있는지 확인합니다. 예제를 실행하면 문자열 변수에 유효한 guid 형식이 없으며 "InValid guid"라는 메시지가 표시됩니다. 문자열 변수에 유효한 GUID가 있으면 TryParse 메서드에서 true를 반환합니다.


7
질문은 GUID의 유효성을 검사하지 않고 더 긴 문자열에서 GUID를 찾거나 추출하는 방법을 묻는 것이 었습니다. 이 답변을 제거 할 것을 제안합니다.
Gone Coding

13
@Micah Armantrout : "좋은"대답 일 수 있지만 이 질문에 대한 대답은 아닙니다 . 원하는 곳에 답을 넣으면 StackOverflow의 목적에 위배됩니다. :)
Gone Coding

8
글쎄요, 저와 같은 사람이 "guid에 대한 정규식"을 검색하는 경우이 답변이 가장 도움 이되었습니다. 정규식 필요 하지 않고 GUID와 일치해야하며이 페이지는 "검색 할 정규식"에 대한 첫 번째 결과입니다. guid '가 현재 Google에 있습니다.
Dan Field

3
세컨 딩 @ 댄 필드. 나는 guid에 대한 정규식을 검색하기 위해 여기에 왔고이 대답이 내가 정말로 원했던 것을 발견했습니다. 따라서 StackOverflow의 목적이 달성되었습니다.
JLScott

이것은 관련 답변은 아니지만 물론 도움이됩니다. 나로부터 한 표. :)
Merin Nakarmi

8

http://regexhero.net/tester/를 사용하여 C # 코드를 쉽게 자동 생성 할 수 있습니다 .

무료입니다.

내가 한 방법은 다음과 같습니다.

여기에 이미지 설명 입력

그런 다음 웹 사이트에서 .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.