developer tip

.NET 정규식 : 단어 문자 \ w는 무엇입니까?

optionbox 2020. 11. 8. 09:46
반응형

.NET 정규식 : 단어 문자 \ w는 무엇입니까?


간단한 질문 : c #, .net에서
문자라는 단어의 패턴은 무엇입니까 \w?

내 첫 번째 생각은 일치 [A-Za-z0-9_]하고 문서에 다음 과 같이 나와 있습니다.

문자 클래스 설명 패턴 일치
\ w 모든 \ w "I", "D", "A", "1", "3"과 일치
                   단어 문자. "ID A1.3"에서

별로 도움이되지 않습니다.
그리고 역시 \w일치하는 것 같습니다 äöü. 또 뭐야? 더 나은 (정확한) 정의를 사용할 수 있습니까?


로부터 문서 :

단어 문자 : \ w

\w모든 단어 문자와 일치합니다. 단어 문자는 다음 표에 나열된 유니 코드 범주의 구성원입니다.

  • Ll (문자, 소문자)
  • Lu (문자, 대문자)
  • Lt (레터, 타이틀 케이스)
  • Lo (편지, 기타)
  • Lm (편지, 수정 자)
  • Nd (숫자, 십진수)
  • Pc (구두점, 커넥터)
    • 이 범주에는 10 개의 문자가 포함되며 가장 일반적으로 사용되는 문자는 LOWLINE 문자 (_), u + 005F입니다.

ECMAScript 호환 동작이 지정된 경우 \w[a-zA-Z_0-9].

또한보십시오


기본적으로 다양한 스크립트에서 문자 의 직관적 인 정의로 간주 될 수있는 모든 것과 밑줄 및 기타 몇 가지 이상한 부분과 일치 합니다.

다음과 같은 작은 PowerShell 스 니펫으로 전체 목록 (적어도 BMP의 경우)을 찾을 수 있습니다.

0..65535 | ?{([char]$_) -match '\w'} | %{ "$_`: " + [char]$_ }

따라서 .NET에서 '\ w'를 사용하는 몇 가지 연구 후에는 다음과 같습니다.

public static class Extensions { 
    /// <summary>
    /// The word categories.
    /// </summary>
    [NotNull]
    private static readonly HashSet<UnicodeCategory> _wordCategories = new HashCollection<UnicodeCategory>(
                new[]
                {
            UnicodeCategory.DecimalDigitNumber,
            UnicodeCategory.UppercaseLetter,
            UnicodeCategory.ConnectorPunctuation,
            UnicodeCategory.LowercaseLetter,
            UnicodeCategory.OtherLetter,
            UnicodeCategory.TitlecaseLetter,
            UnicodeCategory.ModifierLetter,
            UnicodeCategory.NonSpacingMark,
                });

    /// <summary>
    /// Determines whether the specified character is a word character (equivalent to '\w').
    /// </summary>
    /// <param name="c">The c.</param>
    public static bool IsWord(this char c) => _wordCategories.Contains(char.GetUnicodeCategory(c));
}

나는 어떤 캐릭터를 쉽게 사용할 수 있도록 확장 방법으로이 서면으로 작성했습니다 c방금 된 invoke c.IsWord()반환하는 true문자는 단어 문자 인 경우. 이것은 Regex를 사용하는 것보다 훨씬 빠릅니다.

흥미롭게도 이것은 .NET 사양과 일치하지 않는 것 같습니다. 사실 '\ w'는 언급되지 않은 938 개의 'NonSpacingMark'문자와 일치합니다.

총 65,535 개의 문자 중 49,760 개와 일치하므로 웹에 자주 표시되는 간단한 정규식은 불완전합니다.

참고 URL : https://stackoverflow.com/questions/2998519/net-regex-what-is-the-word-character-w

반응형