ASP.NET 정규 표현식, ID체크, Summary
정규식은 정답이 없으며 주민번호 정규식도 갈긱 제각각이다.
정규 표현식(Regular Expression)
- 문자열의 특정 패턴을 이용해서 원하는 데이터 검색하는 표현식
정규 표현식 문법
1. .
- 임의의 한문자
- ex) "...", "표.."
2.
- 출현횟수(생략X, 중복X)
- ex) "abc"
3. ?
- 출현횟수(생략O, 중복X)
- ex) "a?bc" -> "bc", "abc"
"홍?길동" ->
4. +
- 출현횟수(생략X, 중복O)
- ex) "a+bc" -> "abc", "aabc", "aaabc", "aaaaabc"
"0+25" -> 025, 0025, 00025
5. *
- 출현횟수(생략O, 중복O)
- ex) "a*bc" -> "bc", "abc", "aabc", "aaaaaabc"
"0*25" -> 25, 025, 0025, 00025
6. ^
- 바로 뒤에 나오는 표현으로 시작합니까?
- ex) "^abc"
"^홍.."
7. $
- 바로 앞에 나오는 표현으로 끝납니까?
- ex) "xyz$"
"하세요\?$"
8. []
- 열거형
- 나열된 문자 중 1개
- ex) "[abc]"
"[김이홍]?길동" -> 김길동, 이길동, 홍길동, 길동
숫자 1개 검색
- [0123456789]
숫자 3개 검색
- [0123456789][0123456789][0123456789]
전화번호 검색
- [0123456789][0123456789][0123456789]?-[0123456789][0123456789][0123456789][0123456789]?-[0123456789][0123456789][0123456789][0123456789]
- [0-9][0-9][0-9]?-[0-9][0-9][0-9][0-9]?-[0-9][0-9][0-9][0-9]
알파벳 소문자 1개
- [abcdefghijklmnopqrstuvwxyz]
알파벳 1개
- [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]
영어단어 2글자~20글자
숫자 1개
- [0-9]
영어 소문자
- [a-z]
영어 대소문자
- [a-zA-Z]
한글 1개
- [가-힣]
영어 혹은 숫자 1개 -> 식별자 구성 요소
- [a-zA-Z0-9]
9. {}
- 출현횟수(세세하게 지정 가능)
- {count}
- {minCount,}
- {minCount, maxCount}
- ex) "a{2}b" -> aab
"a{2,}b" -> aab, aaab, aaaab, aaaaaaaaab
"a{2,4}b" -> aab, aaab, aaaab
주민번호 검사(123456-1234567)
- "[0-9]{6}-[0-9]{7}"
- "[0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
전화번호
- "[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}"
아이디 입력
- 길이는 4~12자이내
- 영어와 숫자로 구성
"[a-zA-Z]{1}[a-zA-Z0-9]{3,11}"
- 숫자로는 시작 불가
- _는 사용 가능
영어 대소문자
- [a-zA-Z]
10. 표현법
- "\s" -> 공백
- "\d" -> [0-9]
- "\w" -> 영어대소문자, 숫자,_
- 홍길동, 홍 길동 -> "홍\s?길동"
- [0-9]{2,3}-[0-9]{3,4}-[0-9]{4}
-> \d{2,3}--\d{3,4}-\d{4}
- 영어와 숫자와 _로 구성된 4~12자이내
-> \w{4,12}
단일
여러개
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex27_RegEx.aspx.cs" Inherits="Ex27_RegEx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex27_RegEx.aspx</h2>
<h3>
<br />
검색 대상</h3>
<asp:TextBox ID="TextBox1" runat="server" Height="153px" TextMode="MultiLine"
Width="655px">2008년 대선후보이던 오바마 대통령은 동성결혼에 반대하지만 동성커플에게 동등한 권리를 주는 시민결합(civil union)에 대해 찬성하는 입장을 밝혔다. 동성결혼에 대한 자신의 입장이 “진화하고 있다”고 말한 오바마 대통령의 2010년 가을 발언은 찬성으로 향하고 있다는 뜻으로 해석되었다. 이제까지 오바마 대통령은 동성결혼과 관련한 입장이 바뀌었는지에 대한 수많은 질문을 회피하면서 동성애자 권리와 관련한 자신의 업적에 대해 이야기했다.
수요일 오바마 대통령은 다음과 같이 해명했다. “내가 동성결혼에 대한 입장을 적극적으로 밝히지 않은 이유는 시민결합이 충분하다고 생각한 데 일부 기인한다…또한 많은 사람이 ‘결혼’이라는 단어와 관련해 강력한 전통과 종교적 믿음 등을 생각한다는 사실을 고려했을 때 조심스럽기도 했다.”
오바마 대통령은 군대에서 복무 중인 동성애자들과 동성커플로서 자녀를 양육하고 있는 백악관 관계자들을 보면서 자신의 입장이 변화했다고 말했다.
올해 초 오바마 대통령은 소수의 수석 보좌진에게 9월 민주당 전당회의 이전에 동성결혼 지지의사를 발표하겠다고 말했다고 정부 고위관계자는 전했다. 일요일 바이든 부통령이 TV인터뷰에서 동성결혼을 지지하는 의사를 밝힌 후 3일 동안 입장을 분명히 하라는 압력이 고조되면서 발표시기를 앞당기게 되었다고 한다.
</asp:TextBox>
<br />
<h3>
패턴</h3>
<br />
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="한개찾기" Width="150px"
onclick="Button1_Click" />
<asp:Button ID="Button2" runat="server" onclick="Button2_Click"
style="height: 21px" Text="여러개 찾기" Width="142px" />
<br />
<h3>
결과</h3>
<p>
<asp:ListBox ID="ListBox1" runat="server" Height="110px" Width="431px">
</asp:ListBox>
</p>
<br />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;//**
public partial class Ex27_RegEx : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//정규식을 이용한 C# 패턴 찾기
// - RegEx 클래스(정규식을 쓸수있게해주는것)
// - "[김이홍]길동" 김길동 이길동 홍길동
Regex regex = new Regex(TextBox2.Text);//정규식
//Match라는 결과값으로 반환시켜준다.
Match m = regex.Match(TextBox1.Text);
//무조건 찾는건 아니다. 패턴이 없으면 못찾는다.
//초기화
ListBox1.Items.Clear();
if (m.Success) //true 나 false 반환
{
//어떤놈을 찾을거냐~ 몇번째 얼마나
string result = string.Format("찾음 : {0}, {1}, {2}", m.Index, m.Length, m.Value);//m.Value가 몇글자인지 찾아준다.
ListBox1.Items.Add(result);
}
else
{
ListBox1.Items.Add("원하는 결과 텍스트가 없습니다.");
}
}
protected void Button2_Click(object sender, EventArgs e)
{
ListBox1.Items.Clear();
//여러개의 패턴 결과값
Regex regex = new Regex(TextBox2.Text);
//regex.Match() 컬렉션 반환
MatchCollection mc = regex.Matches(TextBox1.Text);
foreach (Match m in mc)
{
if (m.Success)
{
string result = string.Format("찾음 : {0}, {1}, {2}", m.Index, m.Length, m.Value);
ListBox1.Items.Add(result);
}
else
{
ListBox1.Items.Add("원하는 결과 텍스트가 없습니다.");
}
}
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex28_ID.aspx.cs" Inherits="Ex28_ID" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex28_ID.aspx</h2>
<br />
<br />
<h3>
아이디 :
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ControlToValidate="TextBox1" ErrorMessage="잘못된 아이디"
ValidationExpression="^[a-zA-Z0-9_]{3,11}$"></asp:RegularExpressionValidator>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="검색" Width="167px"
onclick="Button1_Click1" />
</h3>
<br />
<br />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;
public partial class Ex28_ID : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click1(object sender, EventArgs e)
{
//숫자를뺀영어중 한글자 3글자랑 11글자가 되야 총 4글자에 12글자가 된다.
//0-9 뒤에 _ 문자는 그냥 넣게되면 텍스트 된다.
//테스트시 홍길동 test1234 하면 사용가능 하다고 나온다 치명적인 오류
//그래서 맨앞 ^ 맨뒤$를 붙여줘야한다.
string pattern = @"^[a-zA-Z0-9_]{3,11}$";
Regex regex = new Regex(pattern);
Match m = regex.Match(TextBox1.Text);
if (m.Success)
Label1.Text = "사용가능한 아이디";
else
Label1.Text = "사용 불가능 아이디";
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex29_Summary.aspx.cs" Inherits="Ex29_Summary" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>
Ex29_Summary.aspx</h2>
<h3>
아이디 :
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<br />
암호 :
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<br />
<br />
나이 :
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
<br />
</h3>
<asp:Button ID="Button1" runat="server" Text="Button" Width="131px" />
<br />
</div>
<asp:ValidationSummary ID="ValidationSummary1" runat="server"
ShowMessageBox="True" />
<p>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ControlToValidate="TextBox1" Display="None" ErrorMessage="아이디를 입력하세요."
SetFocusOnError="True"></asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ControlToValidate="TextBox2" Display="None" ErrorMessage="암호를 입력하세요."
SetFocusOnError="True"></asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server"
ControlToValidate="TextBox3" Display="None" ErrorMessage="나이를 입력하세요."
SetFocusOnError="True"></asp:RequiredFieldValidator>
</p>
</form>
</body>
</html>