English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 정규 표현식

정규 표현식 입력 텍스트와 일치하는 패턴입니다.

.Net 프레임워크는 이러한 일치를 허용하는 정규 표현식 엔진을 제공합니다.

모델은 하나나 여러 개의 문자, 연산자 및 구조로 구성됩니다.

정규 표현식 정의

다음은 정규 표현식을 정의하는 여러 유형의 문자, 연산자 및 구조를 나열했습니다.

  • 문자 응축

  • 문자 클래스

  • 定位点

  • 그룹 구조

  • 한정자

  • 부정 참조 구조

  • 대체 구조

  • 대체

  • 杂项 구성

문자 응축

정규 표현식에서 반취소 기호(\)는 그 뒤에 따르는 문자가 특수 문자인지, 그 문자를 원래 의미로 해석해야 하는지를 나타냅니다.

아래 표는 익스케이프 문자를 나열합니다:

익스케이프 문자설명모드일치
\a경고 (벨) 문자 \u000과 일치합니다.7 일치합니다。\a"Warning!" + '\u0007' 에서 "\u0007"
\b문자 클래스에서 백스페이스 키 \u000와 일치합니다.8 일치합니다。[\b]{3,}"\b\b\b\b"에서 "\b\b\b\b"
\t줄 바꿈 문자 \u0009 일치합니다。(\w+)\t"Name\tAddr\t"에서 "Name\t"과 "Addr\t"
\r줄 바꿈 문자 \u000D와 일치합니다。(\r과 줄 바꿈 문자 \n은 동일하지 않습니다。)\r\n(\w+)"\r\nHello\nWorld."에서 "\r\nHello"
\v줄 바꿈 문자 \u000B와 일치합니다。[\v]{2,}"\v\v\v"에서 "\v\v\v"
\f줄 바꿈 문자 \u000C와 일치합니다。[\f]{2,}"\f\f\f"에서 "\f\f\f"
\n줄 바꿈 문자 \u000A와 일치합니다。\r\n(\w+)"\r\nHello\nWorld."에서 "\r\nHello"
\e익스케이프 문자 \u00과 일치합니다.1B 일치합니다.\e"\x001B"에서 "\x001B"
\ nnn8진수 형식으로 문자를 지정합니다(nnn은 두에서 세 자리 숫자입니다)。\w\040\w"a bc d"에서 "a b"과 "c d"
\x nn16진수 형식으로 문자를 지정합니다(nn은 두 자리 숫자입니다)。\w\x20\w"a bc d"에서 "a b"과 "c d"
\c X \c xX 또는 x가 지정한 ASCII 컨트롤 문자와 일치하며 X 또는 x는 컨트롤 문자의 문자입니다.\cC"\x0003"에서 "\x0003" (Ctrl-C)
\u nnnn16진수 형식으로 Unicode 문자를 일치시킵니다(nnnn으로 표시된 네 자리 숫자입니다)。\w\u0020\w"a bc d"에서 "a b"과 "c d"
\알려지지 않은 익스케이프 문자가 뒤에 오면 그 문자와 일치합니다.\d+[\+-x\*]\d+\d+[\+-x\*\d+"(2+2) * 3*9"에서 "2+2" 和 "3*9"

문자 클래스

문자 클래스는 그룹의 문자 중 하나와 일치합니다.

아래 표는 문자 클래스를 나열합니다:

문자 클래스설명모드일치
[character_group]character_group에 포함된 어떤 단일 문자와 일치합니다. 기본적으로 일치는 대소문자를 구분합니다.[mn]"mat"에서 "m", "moon"에서 "m"과 "n"
[^character_group]아니면 character_group에 포함되지 않은 어떤 단일 문자와 일치합니다. 기본적으로 character_group의 문자는 대소문자를 구분합니다.[^aei]"avail" 中的 "v" 和 "l"
[ first - last ]字符范围:与从 first 到 last 的范围中的任何单个字符匹配。[b-d][b-d]irds 可以匹配 Birds、 Cirds、 Dirds
.通配符:与除 \n 之外的任何单个字符匹配。
若要匹配原意句点字符(. 或 \u002E),您必须在该字符前面加上转义符 (\.)。
a.e"have" 中的 "ave", "mate" 中的 "ate"
\p{ name }name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配。\p{Lu}"City Lights" 中的 "C" 和 "L"
\P{ name }与不在 name 指定的 Unicode 通用类别或命名块中的任何单个字符匹配。\P{Lu}"City" 中的 "i"、 "t" 和 "y"
\w与任何单词字符匹配。\w"Room#1" 中的 "R"、 "o"、 "m" 和 "1"
\W与任何非单词字符匹配。\W"Room#1" 中的 "#"
\s与任何空白字符匹配。\w\s"ID A1.3" 中的 "D "
\S与任何非空白字符匹配。\s\S"int __ctr" 中的 " _"
\d与任何十进制数字匹配。\d"4 = IV" 中的 "4"
\D匹配不是十进制数的任意字符。\D"4 = IV" 中的 " "、 "="、 " "、 "I" 和 "V"

定位点

定位点或原子零宽度断言会使匹配成功或失败,具体取决于字符串中的当前位置,但它们不会使引擎在字符串中前进或使用字符。

下表列出了定位点:

断言설명모드일치
^匹配必须从字符串或一行的开头开始。^\d{3}"567-777-"에서 "567"
$匹配必须出现在字符串的末尾或出现在行或字符串末尾的 \n 之前。-\d{4}$"8-12-2012"에서 "-2012"
\A匹配必须出现在字符串的开头。\A\w{4}"Code-007-" 中的 "Code"
}\Z匹配必须出现在字符串的末尾或出现在字符串末尾的 \n 之前。-\d{3}\Z"Bond-901-007"에서 "-007"
\z匹配必须出现在字符串的末尾。-\d{3}\z"-901-333"에서 "-333"
\G匹配必须出现在上一个匹配结束的地方。\G(\d)"(1}3}5}7}9中的1)、3)"과 "("5)"
\b단어 경계를 일치시킵니다. 단어와 공백 사이의 위치를 의미합니다。er\b"never"의"er"를 일치시키지만 "verb"의"er"를 일치시키지 않습니다。
\B비 단어 경계를 일치시킵니다.er\Bmatch"verb"의"er"를 일치시키지만 "never"의"er"를 일치시키지 않습니다。

그룹 구조

그룹 구조는 정규 표현식의 서브 표현식을 설명하며, 일반적으로 입력 문자열의 서브 문자열을 캡처하는 데 사용됩니다。

아래 표는 그룹 구조를 나타냅니다:

그룹 구조설명모드일치
( subexpression )일치하는 서브 표현식을 캡처하고 0부터 시작하는 순서로 배정.(\w)1"deep" 中的 "ee"
(?< name >subexpression)일치하는 서브 표현식을 이름이 있는 그룹에 캡처.(?< double>\w)\k< double>"deep" 中的 "ee"
(?< name1 -name2 >subexpression)정규 표현식 평형 그룹 정의.(((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$"3+2^((1-3)*(3-1))" 中的 "((1-3)*(3-1))"
(?: subexpression)비捕获 그룹 정의.Write(?:Line)?"Console.WriteLine()" 中的 "WriteLine"
(?imnsx-imnsx:subexpression)적용 또는 비활성화 subexpression 지정된 옵션.A\d{2}(?i:\w+)\b"A12xl A12XL a12xl" 中的 "A12xl" 和 "A12XL"
(?= subexpression)빈 너비 정규 표현식 부정 예측先行cassert\w+(?=\.)"He is. The dog ran. The sun is out." 中的 "is"、 "ran" 和 "out"
(?! subexpression)빈 너비 정규 표현식 부정 예측先行cassert\b(?!un)\w+\b"unsure sure unity used" 中的 "sure" 和 "used"
(?<=subexpression)빈 너비 정규 표현식 반복 후 주어진cassert(?A+B+)"1ABB 3ABBC 5AB 5AC" 中的 "1ABB"、 "3ABB" 和 "5AB"
using System;
using System.Text.RegularExpressions;
public class Example
{
   public static void Main()
   {
      string input = "1851 1999 1950 1905 2003";
      string pattern = @"(?<=19)\d{2}\b";
      foreach (Match match in Regex.Matches(input, pattern))
         Console.WriteLine(match.Value);
   }
}


실행 예제 »

한정자

한정자는 입력 문자열에서 매칭 항목이 나타나기 위해 필요한 전 ant 요소(문자, 그룹 또는 문자 클래스)의 양을 지정합니다. 한정자는 다음 표에 나열된 언어 요소를 포함합니다.

다음 표는 한정자를 나열합니다:

한정자설명모드일치
*n 횟수 또는 많은 횟수로 일치합니다.\d*.\d".0"、 "19.9、219.9"
+n 횟수 또는 많은 횟수로 일치합니다."be+""been"에서 "bee"، "bent"에서 "be"
?n 횟수 또는 1 횟수로 일치합니다."rai?n""ran"、 "rain"
{ n }n 횟수로 정확히 일치합니다.",\d{3}"1,043.6"에서 043"9,876,543,210"에서 "876、 ",543와 ",210"
{ n ,}n 횟수 이상으로 일치합니다."\d{2,}"166、29、1930"
{ n , m }n 횟수 이상으로, m 횟수 이하로 일치합니다."\d{3,5}"166"17668" "193024"에서 "19302"
*?n 횟수 또는 많은 횟수로, 횟수가 최소한으로 일치합니다.\d*?\.\d".0"、 "19.9、219.9"
+?n 횟수 또는 많은 횟수로, 횟수가 최소한으로 일치합니다."be+?""been"에서 "be"، "bent"에서 "be"
??n 횟수 또는 1 횟수로, 횟수가 최소한으로 일치합니다."rai??n""ran"、 "rain"
{ n }?전두 요소가 정확히 n 횟수로 일치합니다.",\d{3}?""1,043.6"에서 043"9,876,543,210"에서 "876、 ",543와 ",210"
{ n ,}?n 이상의 횟수로, 횟수가 최소한으로 일치합니다."\d{2,}?""166、29" 和 "1930"
{ n , m }?n과 m 사이의 횟수로, 횟수가 최소한으로 일치합니다."\d{3,5}?""166"17668" "193024"에서 "193"와 "024"

부정 참조 구조

부정 참조는 동일한 정규 표현식에서 이전에 일치한 서브 표현식을 나중에 식별할 수 있도록 합니다.

다음 표는 부정 참조 구조를 나열합니다:

부정 참조 구조설명모드일치
\ number부정 참조. 번호된 서브 표현식의 값을 일치시킵니다.(\w)1"seek"에서 "ee"
\k< name >이름 부정 참조. 명명된 표현식의 값을 일치시킵니다.(?< char>\w)\k< char>"seek"에서 "ee"

대체 구조

대체 구조는 either를 활성화하기 위해 정규 표현식을 수정하는 데 사용됩니다./or 일치.

다음 표는 대체 구조를 나열합니다:

대체 구조설명모드일치
|빗점 (|) 문자로 구분된 원소 중 하나와 일치합니다.th(e|is|at)"this is the day. " 中的 "the" 和 "this"
(?( expression )yes | no )정규 표현식 모드가 expression에 의해 일치하면 일치합니다 yes;그렇지 않으면 선택적인 no 부분. expression 은ero width assertion으로 해석됩니다.(?(A)A\d{2}\b|\b\d{3}\b)"A10 C103 910" 中的 "A10" 和 "910"
(?( name )yes | no )name 또는 이름이나 번호가 부여된 잡힌 그룹이 일치하면 일치합니다 yes;그렇지 않으면 선택적인 no(?< quoted>")?(?(quoted).+?"|\S+\s)"Dogs.jpg "Yiska playing.jpg"" 中的 Dogs.jpg 和 "Yiska playing.jpg"

대체

대체는 대체 모드에서 사용되는 정규 표현식입니다.

다음 표는 대체에 사용되는 문자를 나열합니다:

문자설명모드대체 모드입력 문자열결과 문자열
$number그룹에 따라 대체 number 일치하는 서브 문자열.\b(\w+)(\s)(\w+)\b$3$2$1"one two""two one"
${name}이름 그룹에 따라 대체 name 일치하는 서브 문자열.\b(?< word1>\w+)(\s)(?< word2>\w+)\b${word2} ${word1}"one two""two one"
$$"$" 문자를 대체합니다.\b(\d+)\s?USD$$$1"103 USD""$103"
$&전체 일치하는 항목의 한 복사본을 대체합니다.(\$*(\d*(\.+\d+)?){1)**$&"$1.30""**$1.30**"
$`일치하기 전의 입력 문자열의 모든 텍스트를 대체합니다.B+$`"AABBCC""AAAACC"
$'일치한 입력 문자열의 모든 텍스트를 대체합니다.B+$'"AABBCC""AACCCC"
$+마지막으로 잡힌 그룹을 대체합니다.B+(C+)$+"AABBCCDD"AACCDD
$_전체 입력 문자열을 대체합니다.B+$_"AABBCC""AAAABBCCCC"

杂项 구성

다음 표는 다양한杂项 구성을 나열합니다:

구성설명예제
(?imnsx-imnsx)모드 중에 대소문자 구분하지 않는 것과 같은 옵션을 설정하거나 비활성화합니다.\bA(?i)b\w+\b 맞춤 "ABA Able Act" 의 "ABA" 과 "Able"
(?#주석)인라인 주석. 이 주석은 첫 번째 오른쪽 괄호에서 끝납니다.\bA(?#말�뭉치는 A로 시작하는 단어)\w+\b
#}} [행끝]이 주석은 비테이핑된 #으로 시작하여 행의 끝까지 계속됩니다。(?x)\bA\w+\b# A로 시작하는 단어 일치

Regex 클래스

Regex 클래스는 정규 표현식을 나타냅니다。

다음 표는 Regex 클래스에서 일반적으로 사용되는 메서드를 나열합니다:

순번메서드 & 설명
1public bool IsMatch( string input )
정규 표현식 생성자에서 지정된 정규 표현식이 지정된 입력 문자열에서 일치하는지 여부를 지시합니다。
2public bool IsMatch( string input, int startat )
정규 표현식 생성자에서 지정된 정규 표현식이 지정된 입력 문자열에서 일치하는지 여부를 지시합니다。
3public static bool IsMatch( string input, string pattern )
지정된 입력 문자열에서 정규 표현식이 일치하는지 여부를 지시합니다。
4public MatchCollection Matches( string input )
지정된 입력 문자열에서 정규 표현식의 모든 일치를 검색합니다。
5public string Replace( string input, string replacement )
지정된 입력 문자열에서 모든 정규 표현식 패턴의 일치를 지정된 대체 문자로 대체합니다。
6public string[] Split( string input )
입력 문자열을 정규 표현식 패턴에서 지정된 위치에 따라 구분된 서브 문자열 배열로 분할합니다。

Regex 클래스의 전체 속성 목록을 알고 싶다면, 마이크로소프트의 C# 문서를 참조하세요。

예제 1

아래의 예제는 'S'로 시작하는 단어를 일치시킵니다:

온라인 예제

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "A Thousand Splendid Suns";
         Console.WriteLine("Matching words that start with 'S': ");
         showMatch(str, @"\bS\S*");
         Console.ReadKey();
      }
   }
}

위의 코드가 컴파일되고 실행될 때, 다음과 같은 결과가 생성됩니다:

Matching words that start with 'S':
The Expression: \bS\S*
Splendid
Suns

예제 2

다음 예제는 'm'으로 시작하고 'e'로 끝나는 단어를 일치시킵니다:

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "make maze and manage to measure it";
         Console.WriteLine("Matching words start with 'm' and ends with 'e':");
         showMatch(str, @"\bm\S*e\b");
         Console.ReadKey();
      }
   }
}

위의 코드가 컴파일되고 실행될 때, 다음과 같은 결과가 생성됩니다:

Matching words start with 'm' and ends with 'e':
The Expression: \bm\S*e\b
make
maze
manage
measure

예제 3

다음 예제는 과도한 공백을 교체합니다:

using System;
using System.Text.RegularExpressions;
namespace RegExApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         string input = "Hello   World   ";
         string pattern = "\\s"+";
         string replacement = " ";
         Regex rgx = new Regex(pattern);
         string result = rgx.Replace(input, replacement);
         Console.WriteLine("원래 문자열: {0}", input);
         Console.WriteLine("대체 문자열: {0}", result);    
         Console.ReadKey();
      }
   }
}

위의 코드가 컴파일되고 실행될 때, 다음과 같은 결과가 생성됩니다:

원래 문자열: Hello   World   
대체 문자열: Hello World