C# 정규식
정규식은 입력 텍스트와 일치하는 패턴입니다. .Net 프레임워크는 이러한 일치를 허용하는 정규식 엔진을 제공합니다. 패턴은 하나 이상의 문자, 연산자 및 구조로 구성됩니다.
정규식 정의
아래에는 정규식을 정의하는 데 사용되는 문자, 연산자 및 구조의 다양한 범주가 나와 있습니다.
문자 이스케이프
문자 클래스
앵커
그룹 구성
예선자
역참조 구성
대체 공사
교체
기타 constructors
문자 이스케이프
정규 표현식의 백슬래시 문자( )는 그 뒤에 오는 문자가 특수 문자이거나 문자 그대로 해석되어야 함을 나타냅니다.
다음 표에는 이스케이프 문자가 나열되어 있습니다.
이스케이프 문자 | 설명 | 패턴 | 일치 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a | 은 알람(벨) 기호 u0007과 일치합니다. | a | 'u0007' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
b | 의 "경고!" + "u0007"은 백스페이스 키 u0008과 일치합니다. | [b]{3,} | "bbbb" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
t | 의 "bbbb"는 탭 문자 u0009와 일치합니다. | (w+)t | "NametAddrt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
r | 의 "Namet" 및 "Addrt"는 캐리지 리턴 문자 u000D와 일치합니다. (r은 개행 문자 n과 동일하지 않습니다.) | rn(w+) | "rHellonWorld." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
v | 의 "rnHello"는 세로 탭 문자 u000B와 일치합니다. | [v]{2,} | "vvv" in "vvv" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
f | 은 폼 피드 문자 u000C와 일치합니다. | [f]{2,} | "fff" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
n | 의 "fff"는 개행 문자 u000A와 일치합니다. | rn(w+) | "rnHello" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e | 의 "rHellonWorld."는 이스케이프 문자 u001B와 일치합니다. | e | "x001B" in "x001B" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
nnn | 은 8진수 표현을 사용하여 문자를 지정합니다(nnn은 2~3자리 숫자로 구성됨). | w c x | 는 X 또는 x로 지정된 ASCII 제어 문자와 일치합니다. 여기서 X 또는 x는 제어 문자의 문자입니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"x0003" in "x0003"(Ctrl-C) | u nnnn | 은 16진수 표현을 사용하여 유니코드 문자(nnnn으로 표시되는 4자리 숫자)와 일치합니다. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"a bc d" | 의 "a b" 및 "c d"는 인식할 수 없는 이스케이프 문자가 뒤에 오면 일치합니다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"(2+2) * 3*9"("2+2" 및 "3*9" | ) |
문자 클래스 | 설명 | 패턴 | 은 |
---|---|---|---|
과 일치합니다. | 은 문자 그룹의 모든 단일 문자와 일치합니다. 기본적으로 일치는 대소문자를 구분합니다. | [mn] | "mat"의 "m", "moon"의 "m" 및 "n" |
[^character_group] | Non: 문자 그룹 일치에 없는 단일 문자 포함. 기본적으로 Character_group의 문자는 대소문자를 구분합니다. | [^aei] | "avail" |
[ first - last ] | 문자 범위: 처음부터 끝까지 범위에 있는 모든 단일 문자와 일치합니다. | (w+)t | "NametAddrt" |
. | Wildcard의 "Namet" 및 "Addrt": n을 제외한 모든 단일 문자와 일치합니다. 원래 마침표 문자(. 또는 u002E)와 일치시키려면 문자 앞에 이스케이프 문자(.)를 붙여야 합니다. | a.e | "ave" in "have", "ate" in "mate" |
p{ name } | 및 name 단일 유니코드 범용 카테고리 또는 명명된 블록 지정 문자 일치. | p{Lu} | "City Lights" |
P{ name } | 의 "C" 및 "L"은 단일 유니코드 범용 카테고리 또는 로 지정되지 않은 명명된 블록과 동일하지 않습니다. name 문자 매칭. | P{Lu} | "City" |
w | 의 "i", "t" 및 "y"는 모든 단어 문자와 일치합니다. | w | "R", "o", "m" 및 "1" in "Room#1" |
W | 은 단어가 아닌 문자와 일치합니다. | W | "Room#1" |
s | 의 "#"은 모든 공백 문자와 일치합니다. | ws | "ID A1.3"의 "D " |
S | 은 공백이 아닌 모든 문자와 일치합니다. | sS | "int __ctr" |
d | 의 " _"는 모든 십진수와 일치합니다. | d | "4 = IV" |
D | 의 "4"는 십진수가 아닌 모든 문자와 일치합니다. | D | " ", "=", " ", "4 = IV"의 "I" 및 "V" |
Anchors
앵커 또는 너비가 0인 원자 어설션은 문자열의 현재 위치에 따라 일치가 성공하거나 실패하도록 하지만 엔진이 문자열에서 앞으로 나아가거나 문자를 사용하게 하지는 않습니다.
앵커 포인트는 다음 표에 나열되어 있습니다.
Assertion | Description | Pattern | Match |
---|---|---|---|
^ | 일치 항목은 문자열이나 줄의 시작 부분에서 시작해야 합니다. | ^d{3} | "567-777-" |
$ | 의 "567"은 문자열 끝이나 줄이나 문자열 끝의 n 앞에 와야 합니다. . | -d{4}$ | "8-12-2012" |
A | 의 "-2012"는 문자열 시작 부분에 나타나야 합니다. | Aw{4} | "Code-007-" |
Z | 의 "코드"는 문자열 끝이나 문자열 끝의 n 앞에 나타나야 합니다. | -d{3}Z | "Bond-901-007" |
z | 의 "-007"은 문자열 끝에 표시되어야 합니다. | -d{3}z | "-901-333" |
G | 의 "-333"은 이전 경기가 끝난 위치에 나타나야 합니다. | \G(d) | "(1)(3)(5)[7](9)" |
의 "(1)", "(3)" 및 "(5)" b | 일치는 w(영숫자) 문자와 W(영숫자가 아닌) 문자 사이의 경계에서 발생해야 합니다. | w | "Room#1" |
B | 에서 "R", "o", "m" 및 "1"과 일치하는 항목은 b 경계에서 발생하면 안 됩니다. | Bendw*b | "끝은 지속 대출 기관을 보냅니다"의 "끝" 및 "엔더" |
그룹 구문
그룹 구문은 정규식의 하위 표현식을 설명하며 일반적으로 입력 문자열의 하위 문자열을 캡처하는 데 사용됩니다.
다음 표에는 그룹화 구문이 나열되어 있습니다.
그룹화 구문 | Description | Pattern | Match |
---|---|---|---|
( 하위 표현식 ) | 일치하는 하위 표현식 캡처 0부터 시작하여 할당합니다. 일련 번호. | (w)1 | "ee" in "deep" |
(?< name >subexpression) | 은 일치하는 하위 표현식을 명명된 그룹으로 캡처합니다. | (?< double>w)k< double> | "deep" |
(?< name1 -name2 >subexpression) | 의 "ee"는 균형 그룹 정의를 정의합니다. | (((?'열기'()[^()]*)+((?'닫기-열기'))[^()]*)+)*(?(열기)(?!))$ | "((1-3)*(3-1))" in "3+2^((1-3)*(3-1))" |
(?: 하위 표현식) | 비캡처 그룹을 정의합니다. | Write(?:Line)? | "Console.WriteLine()" |
(?imnsx-imnsx:subexpression) | 의 "WriteLine"은 subexpression에 지정된 옵션을 적용하거나 비활성화합니다. | Ad{2}(?i:w+)b | "A12xl A12XL a12xl" |
(?= subexpression) | 너비가 0인 긍정적 예측 어설션의 "A12xl" 및 "A12XL". | w+(?=.) | "그는 그렇습니다. The dog ran. The sun is out." |
(?! 하위 표현) | 의 "is", "ran" 및 "out" 너비가 0인 부정 예측 어설션. | b(?!un)w+b | "unsuresure unity Used"에서 "sure" 및 "used" |
(?< =subexpression) | 어설션은 0을 검토한 후 만들어집니다. 너비 . | (?<=19)d{2}b | "1851 1999 1950 1905 2003" |
(?< ! 하위 표현식) | 의 "99", "50" 및 "05" 너비가 0인 부정 되돌아보기 어설션. | (?< !19)d{2}b | "end sends persist 대출자" |
(?> 하위 표현식) | 비회고적(또한 알려짐)의 "ends" 및 "ender" "탐욕스러운"의 경우) 하위 표현식입니다. | [13579](?>A+B+) | "1ABB 3ABBC 5AB 5AC"의 "1ABB", "3ABB" 및 "5AB" |
Instance
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); } }
인스턴스 실행 »
온라인 인스턴스를 보려면 "인스턴스 실행" 버튼을 클릭하세요
Qualifier
Qualifier는 일치 항목이 발생하기 위해 입력 문자열에 있어야 하는 이전 요소(문자, 그룹 또는 문자 클래스일 수 있음)의 인스턴스 수를 지정합니다. 한정자에는 다음 표에 나열된 언어 요소가 포함됩니다.
다음 표에는 자격이 나열되어 있습니다.
한정자 | 설명 | 패턴 | 일치 |
---|---|---|---|
* | 이전 요소와 0번 이상 일치합니다. | d*.d | ".0", "19.9", "219.9" |
+ | 은 이전 요소와 한 번 이상 일치합니다. | "be+" | "been" in "bee", "be" in "bent" |
? | 은 이전 요소와 0번 또는 1번 일치합니다. | "rai?n" | "ran", "rain" |
{n } | 은 이전 요소와 정확히 n번 일치합니다. | ",d{3}" | "",043" in "1,043.6", ",876", ",543" 및 ",210" in "9,876,543,210" |
{ n ,} | 이전 요소를 n번 이상 일치시킵니다. | "d{2,}" | "166", "29", "1930" |
{n , m } | 이전 요소와 최소 n회 일치하지만 m회 이하 . | "d{3,5}" | "166", "17668", "193024" |
*? | 의 "19302"는 이전 요소와 0번 이상 일치하지만 가능한 적은 횟수로 일치합니다. | d*?.d | ".0", "19.9", "219.9" |
+? | 이전 요소와 한 번 이상 일치하지만 가능한 한 적은 횟수로 일치합니다. | "be+?" | "be" in "been", "be" in "bent" |
?? | 은 이전 요소와 0 또는 1번 일치하지만 가능한 한 적은 횟수로 일치합니다. | "rai??n" | "ran", "rain" |
{n }? | 은 선행 요소와 정확히 n번 일치합니다. | ",d{3}?",043" in " | "1,043.6", ",876", ",543" 및 ",210" in "9,876,543,210" |
{n ,} ? | 이전 요소를 최소한 n번 일치시키되, 가능한 적은 횟수로 일치시키세요. | "d{2,}?" | "166", "29" and "1930" |
{n , m }? | 이전 요소가 일치하는 횟수는 n에서 n 사이입니다. m , 그러나 가능한 한 적은 횟수입니다. | "d{3,5}?" | "166", "17668", "193024" |
역참조 구성
역참조를 사용하면 동일한 정규 표현식 내에서 이전에 일치했던 하위 표현식을 나중에 식별할 수 있습니다.
다음 표에는 역참조 구문이 나열되어 있습니다.
역참조 구문 | 설명 | 패턴 | 은 |
---|---|---|---|
번호 | 역참조와 일치합니다. 숫자 하위 표현식의 값과 일치합니다. | (w)1 | "ee" |
k< name > | 에서 역참조를 찾습니다. 명명된 표현식의 값과 일치합니다. | (?< char>w)k< char> | "seek"의 "ee" |
대체 구문
대체 구문은 정규식을 수정하여 둘 중 하나 또는 일치를 활성화하는 데 사용됩니다.
다음 표에는 대체 구문이 나열되어 있습니다.
대체 구문 | Description | Pattern | 일치 |
---|---|---|---|
| | 은 세로 막대(| ) 문자. | th(e|is|at) | "this is the day. " |
(?( 표현식 )yes | no ) | if 정규식 패턴 지정된 경우 표현식 일치에 따르면 yes와 일치하며, 그렇지 않으면 선택적 no 부분과 일치합니다. 표현식은 너비가 0인 어설션으로 해석됩니다. | (?(A)광고{2}b|bd{3}b) | "A10 C103 910"의 "A10" 및 "910" |
(?( 이름)예 | 아니요 ) | 일치 예 이름이나 이름 또는 번호가 지정된 캡처링 그룹이 일치하는 경우, 그렇지 않으면 선택 사항인 아니요와 일치합니다. | (?< quoted>")?(?(quoted).+?"|S+s) | "Dogs.jpg "Yiska Playing.jpg"" 및 "Yiska Playing.jpg" |
Replacement
Replacement는 대체 패턴에 사용되는 정규식입니다.
다음 표에는 대체에 사용되는 문자가 나열되어 있습니다.
문자 | 설명 | 패턴 | 교체 패턴 | 입력 문자열 | 결과 문자열 |
---|---|---|---|---|---|
$ number | 교체 일치 하위 문자열 기준 그룹 number. | b(w+)(s)(w+)b | $3$2$1 | "하나 둘" | "둘 하나" |
${name} | 이름이 지정된 그룹 name으로 바꾸기 일치하는 하위 문자열. | b(?< word1>w+)(s)(?< word2>w+)b | ${word2} ${word1} | "하나 둘" | "둘 하나" |
$$ | 는 "$" 문자를 대체합니다. | b(d+)s?USD | $$$1 | "103 USD" | "$103" |
$& | 은 전체 경기의 사본을 대체합니다. | ($*(d*(.+d+)?){1}) | **$& | "$1.30" | "**$1.30**" |
$` | 바꾸기 이전 입력 문자열의 모든 텍스트와 일치합니다. | B+ | $` | "AABBCC" | "AAAACC" |
$' | 일치하는 입력 문자열의 모든 텍스트를 바꿉니다. | B+ | $' | "AABBCC" | "AACCC" |
$+ | 은 마지막으로 캡처된 그룹을 대체합니다. | B+(C+) | $+ | "AABBCCDD" | AACCDD |
$_ | 은 전체 입력 문자열을 대체합니다. | B+ | $_ | "AABBCC" | "AAAABBCCCC" |
기타 구문
다음 표에는 다양한 기타 구문이 나열되어 있습니다.
Construction | 설명 | 예 |
---|---|---|
(?imnsx-imnsx) | 모드 중간에 대소문자 구분 등의 옵션을 설정하거나 비활성화합니다. | bA(?i)bw+b는 "ABA Able Act" |
(?#comment) | 인라인 댓글의 "ABA" 및 "Able"과 일치합니다. 주석은 첫 번째 닫는 괄호에서 종료됩니다. | bA(?#A로 시작하는 단어와 일치)w+b |
# [줄 끝] | 주석은 이스케이프되지 않은 #으로 시작하여 줄 끝까지 계속됩니다. | (?x)bAw+b#는 A |
Regex 클래스
Regex 클래스는 정규 표현식을 나타내는 데 사용됩니다.
다음 표에는 Regex 클래스에서 일반적으로 사용되는 몇 가지 메서드가 나열되어 있습니다.
일련 번호 | 메서드 및 설명 |
---|---|
1 | public bool IsMatch(
문자열 입력
) Regex 생성자에 지정된 정규식이 지정된 입력 문자열에서 일치하는 항목을 찾았는지 여부를 나타냅니다. |
2 | public bool IsMatch(
문자열 입력,
int 시작
) Regex 생성자에 지정된 정규식이 문자열의 지정된 시작 위치에서 시작하여 지정된 입력 문자열에서 일치하는 항목을 찾는지 여부를 나타냅니다. |
3 | public static bool IsMatch(
문자열 입력,
문자열 패턴
) 지정된 정규식이 지정된 입력 문자열에서 일치하는 항목을 찾았는지 여부를 나타냅니다. |
4 | 공개 MatchCollection 일치(
문자열 입력
) 지정된 입력 문자열에서 정규식을 모두 검색합니다. |
5 | 공개 문자열 바꾸기(
문자열 입력,
문자열 교체
) 지정된 입력 문자열에서 정규식 패턴과 일치하는 모든 일치 문자열을 지정된 대체 문자열로 바꿉니다. |
6 | 공개 문자열[] 분할(
문자열 입력
) Regex 생성자에 지정된 정규식 패턴에 의해 정의된 위치를 기반으로 입력 문자열을 하위 문자열 배열로 분할합니다. |
Regex 클래스의 전체 속성 목록은 Microsoft의 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
다음 예는 'S'로 시작하는 단어와 일치합니다. 'm'으로 시작하고 'e'로 끝나는 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 = "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("Original String: {0}", input); Console.WriteLine("Replacement String: {0}", result); Console.ReadKey(); } } }
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.
Original String: Hello World Replacement String: Hello World