'정규식'에 해당되는 글 4건
- 2009.03.03 정규식을 이용한 숫자입력 체크 함수
- 2009.02.16 정규식 Regular Expression
- 2009.02.08 c# 정규 표현식
- 2009.02.08 C# Regular Expressions
* 단점 : 한글인 경우 체크가 안됩니다....ㅠㅠ
// 숫자, 콤마(,), 소숫점(.) 허용한 숫자체크
// 반환값 true / false
function IsNumber(strNumber)
{
var reg = RegExp(/^(\d|-)?(\d|,)*\.?\d*$/);
return reg .test(strNumber);
}
// IsNumber함수를 이용한 필드 입력값 체크
// 사용방법 : <input type="text" onkeyup="CheckNumber(this)">
function CheckNumber(field) {
if( !IsNumber(field.value) )
{
alert!("숫자형식만 입력해주십시오.");
field.value="0";
field.focus();
field.select();
}
}
출처 : 몽키님 블로그
(http://blog.daum.net/monkeychoi/4967162?srchid=BR1http%3A%2F%2Fblog.daum.net%2Fmonkeychoi%F4967162)
(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시
예 : ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
(2) $ (dollar) : 라인의 끝이나 문자열의 끝을 표시
예 : aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
(3) . (period) : 임의의 한 문자를 표시
예 : ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)
(4) [] (bracket) : 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄
[]내에서 "^"이 선행되면 not을 나타냄
이외에도 "문자클래스"를 포함하는 [:문자클래스:]의 형태가 있다.
여기에서 "문자클래스"에는 alpha, blank, cntrl, digit, graph, lower,
print, space, uppper, xdigit가 있다.
이에 대한 자세한 내용은 C언어의 <ctype.h>를 참조하면 된다.
예를 들어 [:digit:]는 [0-9]와 [:alpha:]는 [A-Za-z]와 동일하다.
이외에 [:<:]와 [:>:]는 어떤 단어(숫자, 알파벳, '_'로 구성됨)의 시작과 끝
을 나타낸다.
예 : [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일)
[Yy] (Y 또는 y)
[A-Za-z0-9] (모든 알파벳과 숫자)
[-A-Z]. ("-"(hyphen)과 모든 대문자)
[^a-z] (소문자 이외의 문자)
[^0-9] (숫자 이외의 문자)
[[:digit:]] ([0-9]와 동일)
(5) {} (brace) : {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄
예 : a{3} ('a'의 3번 반복인 aaa만 해당됨)
a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄)
a{3,5} (aaa, aaaa, aaaaa 만 해당됨)
ab{2,3} (abb와 abbb 만 해당됨)
[0-9]{2} (두 자리 숫자)
doc[7-9]{2} (doc77, doc87, doc97 등이 해당)
[^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당)
.{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당)
(6) * (asterisk) : "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열
예 : ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등)
* (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨)
.* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨)
ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등)
a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등)
doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당)
[A-Z].* (대문자로만 이루어진 문자열)
like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이 됨, like, likely, liker, likelihood 등)
(7) + (asterisk) : "+" 직전의 선행문자가 1번 이상 나타나는 문자열
예 : ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨)
ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등)
like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨)
[A-Z]+ (대문자로만 이루어진 문자열)
(8) ? (asterisk) : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열
예 : ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)
(9) () (parenthesis) : ()는 정규식내에서 패턴을 그룹화 할 때 사용
(10) | (bar) : or를 나타냄
예 : a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함)
yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함)
korea|japan|chinese (korea, japan, chinese 중 하나)
(11) \ (backslash) : 위에서 사용된 특수 문자들을 정규식내에서 문자를 취급하고 싶을 때 '\'를 선행시켜서 사용하면됨
예 : filename\.ext ("filename.ext"를 나타냄)
[\?\[\\\]] ('?', '[', '\', ']' 중 하나)
정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함
정규식은 Unix의 대표적인 유틸리티인 vi, emacs, ed, sed, awk, grep, egrep 등에서 사용할 수 있다. 다음은 grep에서 정규식을 활용한 예를 보여 주고 있다.
(1) $ 명령어 | grep '정규식'
<= 명령어의 결과를 grep이 입력받아 정규식을 이용하여 패턴을 찾아냄
예 : $ who | grep 'hgkim' <= hgkim이라는 사용자가 login 해 있는지를 알아봄
$ ls -al | grep '^d.*' <= ls -al 의 결과 'd'로 시작하는 라인(즉 디렉토리들)
만을 출력
$ ls -al | grep '^d.*' <= ls -al 의 결과 'd'로 시작하는 라인(즉 디렉토리들)
만을 출력
$ ls -al | grep '^[^d]..x..x..x' <= 디렉토리는 제외하고("[^d]") 누구나
실행가능한 파일("..x..x..x")들 찾기
(2) $ grep '정규식' 파일이름
<= 파일을 입력받아 정규식을 이용하여 패턴을 찻아냄
예: $ grep 'telnet' /etc/inetd.conf
이외의 명령어들도 grep과 유사한 형태로 이용된다. 따라서 정규식을 잘 이용하면 유닉스의 활용이 배가 될 것이다.
PHP에서는 정규식과 관련하여 다음의 네가지 함수를 제공한다.
int ereg(string givenPattern, string givenString, array matched);
- givenString을 "string1stringAstring2stringBstring3 ... string9stringI" 로 주어져 있다고 하자. 이때 stringA, stringB, ... , stringI는 NULL 이어도 상관이 없다(즉 givenString은 "string1string2string3 ... string9" 인 경우임).
- givenString이 위와 같이 주어진 경우,
givenPattern은 "(pattern1)stringA(pattern2)stringB(pattern3) ... (pattern9)stringI"로 입력하여야 한다. 즉 pattern1, pattern2, ..., pattern9는 각각 string1, string2, ... , string9에서 찾고자하는 정규식인 것이다.
- 이때 pattern1이 string1에서 발견한 패턴은 $matched[1]에 저장되고, pattern2가 string2에서 발견한 패턴은 $matched[2]에 저장되고, ..., pattern9가 string9에서 발견한 패턴은 $matched[9]에 저장된다. PHP3의 경우 ereg에서는 최대 9개 까지의 pattern을 찾을 수 있도록 설정되어 있음에 유의하자.
- 그리고 $matched[0]에는 $matched[1]stringA$matched[2]stringB ... $matched[9]stringI가 저장된다.
- ereg가 반환하는 값은 $matched[0]에 저장된 문자열의 개수이다.
- ereg는 case sensitive
- eregi는 case insensitive
예1 :
코드 => print(ereg ("(.*)ef([abc].*)","abcdefabc",$matched));
print("<br>");
while (list($a,$b)=each($matched))
if ($b)
print("$a, $b <br>");
결과 => 9
0, abcdefabc
1, abcd
2, abc
예2 :
코드 => print(ereg ("(.*)d(.*)e(.*)qrs(.*)","abcdefghijklmnopqrstuvwxyz",$matched));
print("<br>");
while (list($a,$b)=each($matched))
if ($b)
print("$a, $b <br>");
결과 => 26
0, abcdefghijklmnopqrstuvwxyz
1, abc
3, fghijklmnop
4, tuvwxyz
예 3 :
코드 => $date="1999-11-17";
if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs))
print("$regs[3].$regs[2].$regs[1]");
else print("Invalid date format: $date");
결과 => 17.11.1999
예 4 :
코드 => $joomin="711011-1234567";
if (ereg("([0-9]{2})([01]{1}[09]{1}[0-3]{1}[0-9]{1})-([12]{1}[0-9]{6})",$date, $regs))
print("Valid");
else print("Invalid format: $joomin");
int eregi(string givenPattern, string givenString, array matched);
- ereg의 'case insensitive' 버젼
예 :
코드 => $email="xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr";
eregi("(^[_\.0-9a-z-]+)@(([0-9a-z][0-9a-z-]+\.)+)([a-z]{2,3}$)",$email,$matched);
while (list($a,$b)=each($matched))
if ($b) print("$a, $b <br>");
결과 => 0, xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr
1, xs9_tx-abc.yyy_c
2, cne.kyungsung.ac.
3, ac.
4, kr
코드 => eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3}$",$email,$matched);
while (list($a,$b)=each($matched))
if ($b) print("$a, $b <br>");
결과 => 0, xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr
1, ac.
string ereg_replace(string givenPattern, string replacementPattern, string givenString);
- givenString에서 givenPattern에 부합하는 텍스트(matched text)를 찾아서,
replacementPattern으로 대체
- givenPattern이 "(패턴)"으로 묶인 문자열들을 포함하고 있으면, replacementPattern에는 이에 대응하는 "\\digit(문자열)" 형태의 문자열들을 포함하고 있어야 한다(digit는 0, 1, ... ,9 중 하나). 그리고 givenString은 "(패턴)"을 이용해 찾은 결과들을 "\\digit(문자열)"에 있는 "문자열"들로 대체하게 된다. "\\0" 는 givenString 전체에 대해 "(패턴)"의 결과를 적용할 때 이용된다.
- 변경된 문자열을 리턴
- case sensitive
예 :
코드 => $string = "This is a test";
print(ereg_replace(" is", " was",$string)); print("<br>");
print(ereg_replace("( )is","\\1was",$string)); print("<br>");
print(ereg_replace("(( )is)","\\2was",$string)); print("<br>");
print(ereg_replace("(( )is)(( )a)(( )test)", "\\1was\\2an\\3exam",$string));
결과 => "This was a test";
"This was a test";
"This was a test";
"This was an exam";
예 2 : redundant whitespace 없애기
코드 => $str ="~ s/\s+/ /g";
$str = eregi_replace("[[:space:]]+", " ", $str);
print("$str<br>");
결과 => ~ s/\s+/ /g
string eregi_replace(string givenPattern, string replacementPattern, string givenString);
- ereg_replace의 'case insensitive' 버젼
[펌] http://phpschool.com/bbs2/inc_view.html?id=11581&code=tnt2
출처 : http://cutecars.tistory.com/category
정규 표현식은 책으로도 1권 될 정도로 분량도 많고 복잡하기도 하고 나에겐 매우 어렵다..ㅡ,.ㅡ;
그래서 네이년한테 물어봤더니 쫘~~~~악~~ 그것도 한글로 나오는데 읽어도 읽어도 당췌 뭔소린지
알수가 없다...ㅡ,.ㅡ;;;; 고로 거창하게는 아니고 그냥 프로젝트하다가 적용한 사례 정도만 나중에 혹시
사용할일이 있지 않을까해서 정리해논다(사실 정리 안됨..ㅡ,.ㅡ;;)
본인은 C, C++이 주 언어지만(그렇다고 절대로!! 잘하는건 아님) C#코드로 구현했기 때문에
개발자답게(?) 고대로 Copy & Paste와 간단한 설명을 남긴다.
참고로 C#인지 닷넷인지뭔지 몰라도 이놈은 정규식을 완벽히 지원한단다.
using System.Text.RegularExpressions
bool IsVaildStr(string strText)
{
string Pattern = @"^[a-zA-Z0-9가-힣]*$";
return Regex.IsMatch(strText, Pattern);
}
간단히 설명하자면 strText의 문자열이 대-소문자 알파벳, 숫자, 한글인지를 체크하는 정규식이다
유저 계정 만들때 사용한 정규식인데 아이디에 특수문자를 사용할수 없게끔하는 식이다
특이하게 한글이 들어간 이유는 모 포탈 사이트에서는(한게임인가로 기억됨...아님 말고...^^)
한글 계정도 지원한다기에 그냥 넣어봤다
자세한 내용은 아래 설명 참조!
※ 정규식 설명
^
입력의 시작 위치를 의미한다. 여러 줄 모드에서는 줄바꿈 뒤도 의미한다
/^A/
"An A"에서 시작 위치 바로 뒤의 A는 일치하지만 마지막의 A는 일치하지 않는다.
^[a-z]
첫 글자는 반드시 소문자 a-z 사이의 문자를 뜻한다
$
입력의 마지막 위치를 의미한다. 여러 줄 모드에서는 줄바꿈 앞도 의미한다.
/a$/
"Cocoa"에서 마지막에 있는 'a'와 일치한다.
[a-z]$
마지막 글자는 반드시 소문자 a-z사이의 문자를 뜻한다
*
* 앞의 문자가 0번 이상 반복됨을 의미한다.
선택 기호: "|" 기호는 여러 식 중에서 하나를 선택한다.
"abc|adc"는 abc라는 문자열과 adc라는 문자열을 모두 포함한다.
묶기 기호: (와 )로 여러 식을 하나로 묶을 수 있다.
"abc|adc"와 "a(b|d)c"는 같은 의미를 가진다.
[] : [과 ] 사이의 문자 중 하나를 선택한다. "|"를 여러 개 쓴 것과 같은 의미를 가진다.
[abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 문자의 범위를 지정할 수 있다.
[a-z]는 a부터 z까지 중 하나, [1-9]는 1부터 9까지 중의 하나를 뜻한다.
[^] : [^과 ] 사이의 문자를 제외한 나머지 하나를 선택한다.
[^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다.
[^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 나타낸다.
※ POSIX 문자 그룹(character Classes)
Dos를 사용하던 시절에는 *, !, ?, <>, [] 같은 wildcard 문자를 사용하여 다양한 작업을 했었습니다.
이 방식은 지금도 unix 계열에서는 사랑받는 방식입니다.
그리고 현재도 콘솔에서 프로그램 뒤에 파라미터를 넣는 방식은 널리 사용되고 있습니다.
정규 표현식은 이런 정의된 문자를 사용해서 패턴을 만들고 그 패턴을 이용해서 원하는 문자를 가져오거나 바꾸는 데 사용되는 방식입니다.
C#에서도 이런 정규 표현식을 작업하기 쉽도록 지원해 줍니다. 그럼 정규 표현식을 지원하는 클래스 들을 알아보겠습니다.
일단 정규 표현식 관련 클래스들은 System.Text.RegularExpressions 에 있습니다.
그리고 System.Text.RegularExpressions 에는 Regex 클래스가 존재합니다.
이 Regex 클래스에는 정적 메서드가 여러 개 포합되어 있어서 Regex 개체를 명시적으로 만들지 않고도 정규식을 사용할 수 있습니다.한번 사용한 다음 소멸시킨다는 점에서 정적 메서드를 사용하는 것은 Regex 개체를 만드는 것과 같습니다. Regex 클래스 자체는 스레드로부터 안전하며 읽기 전용으로, 변경할 수 없습니다. 즉, Regex 개체는 모든 스레드에서 만들어질 수 있고 또한 스레드 간에 공유될 수 있으며 관련 메서드는 전역 상태에 전형 영향을 주지 않으면서 모든 스레드에 대해 호출될 수 있습니다. 그러나 Regex 에서 반환하는 Match 및 MatchCollection 과 같은 결과 개체는 단일 스레드에서만 사용해야 합니다.
Regex 클래스에서 자주 사용되는 메서드들은 다음과 같습니다.
l IsMatch(string) - 정규식이 입력 문자열에서 일치하는 항목을 찾을 것인지 여부를 나타냅니다.
l Match(string) - 입력 문자열에 정규식이 있는지 검사하고 정확한 결과를 단일 Match 개체로 반환합니다.
l Matches(string) - Match를 여러 번 호출한 것처럼 입력 문자열에 있는 정규식을 모두 검색하고 성공적인 일치 항목을 모두 반환합니다.
l Replace(pattern, string) - 정규식에 의해 정의된 문자 패턴이 발견되면 지정된 대체 문자열로 모두 바꿉니다.
l Split(string, pattern) - 정규식 일치에 의해 정의된 위치에서 부분 문자열로 이루어진 배열로 입력 문자열을 분할합니다.
이제 간단한 예제들을 보여 드리겠습니다.
언제나 그러하듯 아래 예제들은 제가 msdn 및 기타 사이트 들에서 긁어온 것들을 살짝 변경하였습니다.
IsMatch() 와 Match() 메서드의 사용법을 알수 있는 예제입니다.
(http://msdn.microsoft.com/ko-kr/library/system.text.regularexpressions.regex_members(VS.80).aspx)
using System; using System.Text.RegularExpressions; public class Test { public static void Main() { // 정규 표현식을 정의합니다. Regex rx = new Regex(@"^-?\d+(\.\d{2})?$"); // 입력될 스트링을 정의합니다. string[] tests = { "-42", "19.99", "0.001", "100 USD" }; // 테스트 코드입니다. foreach (string test in tests) { if (rx.IsMatch(test)) Console.WriteLine("{0} is a currency value.", test); else Console.WriteLine("{0} is not a currency value.", test); } Console.ReadLine(); } } |
이번에도 IsMatch() 와 Match() 메서드의 사용법을 알수 있는 예제입니다. (http://www.mikesdotnetting.com/Article.aspx?ArticleID=50)
using System; using System.Text.RegularExpressions; namespace TestCode03 { class Program { static void Main(string[] args) { string input = "A12"; //Regex 개체를 생성하는 예제입니다. //@"[a-z]\d": 알파벳이 나온 후 integer 형이 나옵니다. //RegexOptions.IgnoreCase: 대소문자를 구문하지 않는 옵션입니다. Regex re = new Regex(@"[a-z]\d", RegexOptions.IgnoreCase); Match m = re.Match(input); if (re.IsMatch(input)) { Console.Write(m.Value + "\n"); } Console.Write(re.IsMatch(input) + "\n"); //정정 메소드인 Regex를 생성하지 않는 예제입니다. Match m2 = Regex.Match(input, @"[a-z]\d"); if (Regex.IsMatch(input, @"[a-z]\d")) { Console.Write(m2.Value + "\n"); } Console.Write(Regex.IsMatch(input, @"[a-z]\d") + "\n"); Console.ReadLine(); } } } |
MatchCollection 클래스와 Match 클래스의 사용법을 알수 있는 예제입니다.
(http://msdn.microsoft.com/ko-kr/library/system.text.regularexpressions.regex_members(VS.80).aspx)
using System; using System.Text.RegularExpressions; public class Test { public static void Main() { // 반복을 위한 정규 표현식입니다. Regex rx = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b", RegexOptions.Compiled | RegexOptions.IgnoreCase); // 입력되는 문자열입니다. string text = "The the quick brown fox fox jumped over the lazy dog dog."; // 일치하는 문자열을 찾습니다. MatchCollection matches = rx.Matches(text); // 표현식과 일치하는 문자열의 갯수를 나타냅니다. Console.WriteLine("{0} matches found.", matches.Count); // 일치한 문자열을 표시합니다. foreach (Match match in matches) { string word = match.Groups["word"].Value; int index = match.Index; Console.WriteLine("{0} repeated at position {1}", word, index); } Console.ReadLine(); } } |
MatchCollection 클래스와 Match 클래스의 사용법을 알수 있는 예제입니다.
(http://www.mikesdotnetting.com/Article.aspx?ArticleID=50)
using System; using System.Text.RegularExpressions; namespace TestCode04 { class Program { static void Main(string[] args) { string input = "A12 B34 C56 D78"; //Regex 개체를 생성합니다. Regex re = new Regex(@"[a-z]\d", RegexOptions.IgnoreCase); MatchCollection mc = re.Matches(input); foreach (Match mt in mc) { Console.Write(mt.ToString() + "\n"); } Console.Write(mc.Count.ToString() + "\n"); //Regex는 정적클래스 이므로 개체를 생성하지 않아도 됩니다. MatchCollection mc2 = Regex.Matches(input, @"[a-z]\d", RegexOptions.IgnoreCase); foreach (Match mt in mc) { Console.Write(mt.ToString() + "\n"); } Console.Write(mc2.Count.ToString() + "\n"); Console.ReadLine(); } } } |
Replace메서드의 사용법을 알수 있는 예제입니다. 알파벳을 “XX”로 변환합니다.
using System; using System.Text.RegularExpressions; namespace TestCode05 { class Program { static void Main(string[] args) { string input = @"A12 B34 C56 D78 E12 F34 G56 H78"; //Regex 개체 생성 Regex re = new Regex(@"[a-z]\d", RegexOptions.IgnoreCase); string newString = re.Replace(input, "XX"); Console.Write(newString); //Regex 개체를생성하지 않아도 됩니다. string newString2 = Regex.Replace(input, @"[A-Z]\d", "XX"); Console.Write(newString2); Console.ReadLine(); } } } |
Split메서드의 사용법을 알수 있는 예제입니다. 알파벳을 “XX”로 변환합니다.
using System; using System.Text.RegularExpressions; namespace TestCode06 { class Program { static void Main(string[] args) { string input = "AB1 DE2 FG3 HI4 JK5 LM6 NO7 PQ8 RS9"; //Regex 개체 생성 Regex re = new Regex(@"\s"); string[] parts = re.Split(input); foreach (string part in parts) { Console.Write(part + "\n"); } //Regex 개체를생성하지 않아도 됩니다. 스페이스를 기준으로 문자열을 분할합니다. string[] parts2 = Regex.Split(input, @"\s"); foreach (string part2 in parts2) { Console.Write(part2 + "\n"); } Console.ReadLine(); } } } |
End.
C# .NET에서의 Regular Expression 사용 예제
(Example for Regular Expression with C# .NET)