Page_Init

 

- 가장 먼저 발생하는 이벤트

- 컨트롤들의 값을 초기화하거나, 이벤트들을 매핑

 

Page_Load

 

- 페이지가 실질적으로 로드되는 시점에 발생하는 이벤트

- ASP.NET 페이지를 만들며, 이벤트에 응답하는 작업들을 수행

- IsPostBack 속성을 사용하여 페이지가 처음 로드되는 것인지 포스트백 중인지 체크

  (주로 첫 로드시에 데이터 바인딩 작업 수행)

- 이 이벤트 전에 ViewState 를 사용하여 서버 컨트롤들의 상태를 복원

 

Page_DataBind

 

페이지에서 DataBind 메서드가 호출될 때 발생하는 이벤트

 

Page_PreRender

 

- ViewState 상태가 저장되기 전, 컨트롤이 렌더링되기 바로 직전에 발생하는 이벤트

 

Page_Unload

 

- 페이지가 렌더링을 끝마친 뒤에, 모든 작업을 마무리할 때 발생하는 이벤트






서버 컨트롤의 실행주기

컨트롤 생성

Init

ViewState 복구

PostBack 데이터 처리

Load

데이터 변경 이벤트

PastBack 이벤트

PreRenser

ViewState 저장

Render

UnLoad


Posted by 뭉치냐옹
:
요약설명 ASP.NET에는 기존의 '< % % >'태그 외에 데이터 바인딩을 위한 새로운 태그 '< %# % >'를 제공한다. 이 태그는 많은 유연성를 가지고 있어서 특정
데이터 소스 뿐만 아니라 컬렉션이나 메소드를 이용해서 바인딩할 수 있으므로 개발자에게 많은 편의성을 제공한다.

프로퍼티   

Customer : <%# CustomerID %>

표현식    

Contact : <%# (Customer.Firstname + Customer.LastName) %>

메소드

Total : <%# GetTotal(CustomerID) %>

컬렉션

Orders : <asp:ListBox id = "List1" datasource='<%# myArray %>' runat="server">

    

 

    1. 프로퍼티 데이터 바인딩

 

    웹 폼을 생성하고 Label 컨트롤을 추가한 후 Label 컨트롤의 속성창에'(DataBindings)'의 확장버튼을 클릭하면 DataBindings 창이 뜨는 것을

    확인할 수 있을 것이다. 프로퍼티 중에서 데이터바인딩할 것은 Text 프로퍼티이다. 데이터바인딩 창에서 Text 프로퍼티를 선택하고,

    '사용자 지정 바인딩 식'을 선택한 후 'CustomName'이라고 입력하자.

    여기서 CustomName이 바로 우리가 사용할 프로퍼티 변수의 이름이다. 즉, 페이지 클래스의 CustomName 프로퍼티 값을 이용해서 Label 컨트롤의

    Text 프로퍼티를 데이터바인딩 할 것이다.

 

    property.aspx

<form id="Form1" method="post" runat="server">

        <P><FONT face="굴림">Simple Property 데이터바인딩</FONT></P>

        <P><FONT face="굴림"> 안녕하세요.&nbsp;

            <asp:Label id=lblName runat="server" Text="<%# CustomerName %>"> </asp:Label>님 반갑습니다.</FONT></P>

    </form>

    public string CustomerName

    {

        get

        {

            return "Younho~~";

        }

    }

    private void Page_Load(object sender, System.EventArgs e)

    {

        Page.DataBind();

    }

 

    2. 표현식 데이터바인딩

    웹 폼을 생성하고 TextBox 컨트롤 2개와 Button 컨트롤, Label 컨트롤을 추가하자. Label 컨트롤의 속성창에서 '(DataBindings)'의 확장버튼을

    클릭하여 데이터바인딩 창을 띄우고 Text 프로퍼티를 선택하고 '사용자 지정 바인딩식'을 선택한 후 "<%# TextBox1.Text + TextBox2.Text %>"

    라고 입력하자.

 

    expression.aspx

 

    <form id="Form1" method="post" runat="server">

        <P><FONT face="굴림">Expression 데이터바인딩</FONT></P>

        <P><FONT face="굴림">

            텍스트1 : <asp:TextBox id="TextBox1" runat="server"></asp:TextBox><br>

            텍스트2 : <asp:TextBox id="TextBox2" runat="server"></asp:TextBox></FONT></P>

        <P><FONT face="굴림">

            <asp:Button id="btnOK" runat="server" Text="Button"></asp:Button></FONT></P>

        <P><FONT face="굴림">

            <asp:Label id="lblMessage" runat="server" Text="<%# TextBox1.Text + TextBox2.Text %>"></asp:Label>

        </FONT></P>

    </form>

    private void btnOK_Click(object sender, System.EventArgs e)

    {

        Page.DataBind();

    }

 

    3. 메소드 데이터바인딩

    웹 폼을 생성하고 TextBox, Button, Label을 추가하자. Html 뷰어에서 추가한 Label의 Text 프로퍼티에 직접

    '<%# CaculateAge(txtYear.Text) %>'를 추가한다.

    method.aspx

 

 

    <form id="Form1" method="post" runat="server">

        <P><FONT face="굴림">Method 데이터바인딩</FONT></P>

        <P><FONT face="굴림">태어난 년도를 입력하세요.</FONT></P>

        <P>

            <asp:TextBox id="txtYear" runat="server"></asp:TextBox><FONT face="굴림">년

            <asp:Button id="btnOK" runat="server" Text="Button"></asp:Button></FONT></P>

        <P><FONT face="굴림">올해

            <asp:Label id="lblAge" runat="server" Text="<%# CaculateAge(txtYear.Text) %>">

            </asp:Label>&nbsp;세 입니다.</P>

        </FONT>

    </form>

    public int CaculateAge(string BirthYear)

    {

        int Age;

        Age = DateTime.Now.Year - int.Parse(BirthYear) + 1;

        return Age;

    }

    private void btnOK_Click(object sender, System.EventArgs e)

    {

        Page.DataBind();

    }

 

    

    4. 컬렉션 바인딩

    데이터바인딩 방법에서 가장 많이 사용될 부분은 데이터베이스로 부터 쿼리한 데이터를 이용해서 결과를 페이지에 보여 주는 것이다.

    그러나 이러한 경우의 데이터는 단일의 값이 아니라 여러 레코드로 구성되어 있고 게다가 하나의 레코드도 여러 칼럼으로 구성되어 있는 복작한

    구조일 것이다. .NET에서 컬렉션을 구성할 수 있는 자료구조는 여러가지 형태가 있는데 여기서는 ArrayList, HashTabel, Stack, Queue

    그리고 ADO.NET 객체를 이용한 방법을 통한 데이터바인딩을 알아 보도록 한다.

    1) ArrayList : 간단한 값들의 리스트들을 저장할 수 있으며 ListBox나 DropDownList 컨트롤의 아이템을 구성하는데 유용하게 사용될 수 있는

       데이터 소수이다. 간단히 Add() 메소드를 이용해서 값을 추가할 수 있다.

       웹 폼을 생성하고 DropDownList 컨트롤을 추가하자. DropDownList 컨트롤에서 주목해야 될 것은 DataSource 프로퍼티와 DataBind() 메소드이다.

       대부분의 웹 서버 컨트롤은 배열이나 XML, 데이터베이스와 바인딩함으로써 구성될 수 있도록 DataSource 프로퍼티를 제공한다. DataSource 프로퍼티

       에 바인딩할 데이터의 소스를 설정한 후 DataBind() 메소드를 호출하면 지정한 소스로 부터 가져온 값에 의해 컨트롤이 구성된다.

 

       col_arraylist.aspx

 

        <form id="Form1" method="post" runat="server">

            <P><FONT face="굴림">Collection 데이터바인딩 - ArrayList</FONT></P>

            <P><asp:DropDownList id="comArray" runat="server"></asp:DropDownList></P>

        </form>

        private void Page_Load(object sender, System.EventArgs e)

        {

            if(!Page.IsPostBack)

            {

                // ArrayList 아이템 구성

                ArrayList arr = new ArrayList();

                arr.Add("손경동");

                arr.Add("한동균");

                arr.Add("어정두");

                arr.Add("윤석헌");

                // DropDownList 컨트롤 데이터 바인딩

                // DataSource에 ArrayList를 대입시킨다.

                comArray.DataSource = arr;

                comArray.DataBind();

            }

        }

 

    2) HashTable : 키(key)와 값(value)의 짝을 이루는 아이템으로 구성된 자료구조이다. HashTable은 사전(dictionary) 스타일의 데이터를

       저장하는데 흔히 쓰인다. 그리고 키와 값을 저장하고 검색하는데 있어서 내부적으로 해시 알고리즘을 사용한다.

       Add 메소드로 아이템을 추가하고 Remove 메소드를 이용해서 아이템을 삭제할 수 있다.

       웹 폼을 생성하고 RadioButtonList 컨트롤을 추가하자. 여기선 HashTable의 자료를 통해 RadioButtonList 컨트롤을 구성할 것이다.

       RadioButtonList 컨트롤의 Item이 선택되면 라운드트립이 발생할 수 있도록 AutoPostBack을 'True'로 설정한다.

 

       col_hashtable.aspx

 

        <form id="Form1" method="post" runat="server">

            <P><FONT face="굴림">Collection 데이터바인딩 - HashTable</FONT></P>

            <P><asp:RadioButtonList id="optHash" runat="server" AutoPostBack="True"></asp:RadioButtonList></P>

        </form>

        HashTable에 저장할 키(key)로 '가수명'을 그리고 값(value)으로 '노래명'을 짝지어 저장하고

        private void Page_Load(object sender, System.EventArgs e)

        {

            if(!Page.IsPostBack)

            {   

                // HashTable 아이템 구성

                Hashtable htSong = new Hashtable();

                htSong.Add("서태지", "울트라맨이야");

                htSong.Add("마이클잭슨", "Invincible");

                htSong.Add("CBMASS", "휘파람");

                htSong.Add("문윤호", "선하신 목자");

                // RadioButtonList 컨트롤 데이터바인딩

                optHash.DataSource = htSong;

                optHash.DataTextField = "Value";

                optHash.DataValueField = "Key";

                optHash.DataBind();

            }

        }

        private void optHash_SelectedIndexChanged(object sender, System.EventArgs e)

        {

            Response.Write("선택한 아이템 : " + optHash.SelectedItem.Text + "(" + optHash.SelectedItem.Value + ")<hr>");

        }

 

    3) Stack : LIFO(Last-In First-Out) 형태의 컬렉션 구조를 가지는 자료구조이다. 데이터를 저장하는 행위를 'Push'라고 하며

       데이터를 가져오는 행위를 'Pop'이라고 한다. .NET에서는 Stack 자료구조를 BCL 차원에서 지원 해주며 데이터 처리를 위해

       Pop과 Push 메소드를 제공하고 있다.

       웹 폼을 생성하고 ListBox 컨트롤을 추가하자.

 

       col_stack.aspx

 

        <form id="Form1" method="post" runat="server">

            <P><FONT face="굴림">Collection 데이터바인딩 - Stack</FONT></P>

            <P>

                <asp:ListBox id="lstStack" runat="server" SelectionMode="Multiple" Rows="3"></asp:ListBox></P>

        </form>

        private void Page_Load(object sender, System.EventArgs e)

        {

            if(!Page.IsPostBack)

            {

                // Stack 아이템 구성

                Stack st = new Stack();

                st.Push("John Petrucci");

                st.Push("Eric Johnson");

                st.Push("Pat Mathney");

                st.Push("Steve Vai");

                // ListBox 컨트롤 데이터바인딩

                lstStack.DataSource= st;

                lstStack.DataBind();

            }

        }

 

    4) Queue : FIFO(First-In First-Out) 형태의 컬렉션 구조를 가지는 자료구조이다. 데이터를 입력하는 행위를 'Enqueue'라고 하며

       데이터를 추출하는 행위를 'Degueue'라고 한다.

       웹 폼을 생성하고 CheckBoxList 컨트롤을 추가하자.

 

       col_queue.aspx

       <form id="Form1" method="post" runat="server">

            <P><FONT face="굴림">Collection 데이터바인딩 - Queue</FONT></P>

            <P><FONT face="굴림"><asp:CheckBoxList id="chkQueue" runat="server"></asp:CheckBoxList></FONT></P>

        </form>

        private void Page_Load(object sender, System.EventArgs e)

        {

            if(!Page.IsPostBack)

            {

                // Queue 아이템 구성

                Queue q = new Queue();

                q.Enqueue("HDD");

                q.Enqueue("CPU");

                q.Enqueue("VGA");

                q.Enqueue("RAM");

                // CheckBoxList 컨트롤 데이터바인딩

                chkQueue.DataSource = q;

                chkQueue.DataBind();

            }

        }

 

 

    

    5. DataBinder.Eval 메소드

    Repeater나 DataList, DataGrid와 같은 컨트롤은 데이터바인딩에 템플릿(template)을 사용한다. 이때 실제 데이터소스와 연결된 것은 아이템을

    구성하는 템플릿이 아니라 이를 포함하고 있는 부모 객체이므로 템플릿 내에서는 부모객체의 데이터소스에 접근하기 위해서

    Container.DataItem("필드이름")과 같은 형태로접근해야 한다. 바인딩할 아이템을 지정하기 위해 DataBinder.Eval()메소드를 이용한다.

    ex : <%# DataBinder.Eval(Container.DataItem, "CategoryName") %>

    웹 폼 컨트롤을 데이터바인딩할 때 실제 데이터소스의 값이 아니라 어떠한 변형과정을 거쳐서 출력하고자 할 경우, 또는 숫자 값이나 날짜 데이터를

    특정 형태로 보여주고자 할 때에는 DataBinder.Eval() 메소드를 이용해서 표현식을 정의할 수 있다.

    ex : <%# DataBinder.Eval(Container.DataItem, "RegistrationDate", "{0:s}") %>

    숫자 관련 표현식 1

    ----------------------------------------------------------------

    형식 문자                   설명                        예

    ----------------------------------------------------------------

    C/c             화페형(currency)            \1,500,000 , $1,302.50

    D/d             10진수(decimal)         203, 1032, -83

    E/e             지수형(exponential)     3.56E+12, -1.5e+3

    F/f             고정소수점(fix-point)       35.200, -0.291

    G/g             일반형(general)         실제값에 따라 달라짐

    N/n             숫자형(number)          2,593.12 16.21

    P/p             확률형(%)               25.3% -20%

    X/x             16진수(hex)             &H2f89 0x2931

    ----------------------------------------------------------------

    숫자 관련 표현식 2

    ----------------------------------------------------------------

    형식 문자                   설명

    ----------------------------------------------------------------

    0               지정된 자리에 값이 없으면 0으로 표시

    #               지정된 값을 표시하고 값이 없으면 무시

    .               소수점 표시

    ,               컴마로 숫자 그룹을 표시

    %               퍼센트 문자 표시

    ;               양수, 음스, 0일때 값을 구분지어서 표현식을 지정

    ----------------------------------------------------------------

    EX : 1.2345     "00#.##"                001.23

        -1.1234     "00#.##;(00#.##);[0]"   (001.12)

    

    날짜 관련 표현식

    ----------------------------------------------------------------

    형식 문자           설명                                예

    ----------------------------------------------------------------

    d       Short date                  2001-12-21

    D       Long date                   2001년 12월 21일 금요일

    f       full(long date, short time) 1996년 4월 7일 목요일 오전 12:00

    F       Full(long date, long time)  1996년 4월 7일 목요일 오전 12:00:00

    g       일반(short date, short time)    2001-12-21 오전 12:00

    G       일반(short date, long time) 2001-12-21 오전 12:00:00

    M/m     월일                            7월 4일

    R/r     RFC1123 형식                    Thu, 04 Jul 1996 00:00:00 GMT

    s       ISO8601 지역시간                1996-04-07T00:00:00

    t       short time                  오전 12:00

    T       Ling time                   오전 12:00:00

    u       ISO8601 세계시간                1996-07-04 00:00:00Z

    U       Universal date/time         1996년 7월 3일 수요일 오후 3:00:00

    Y/y     년월                            1996년 7월  

    ----------------------------------------------------------------

    웹 폼을 추가하자. DataList, SqlDataAdapter 컨트롤을 추가한다. Northwind DB의 Orders 테이블의 내용을 연결하고

    DataSet은 'DsOrders1' 이름으로 추가한다. DataList 컨트롤의 데이터바인딩을 처리하기 위해서 속성을 설정해 준다.

    DataSource는 'DsOrders1', DataMember는 'Orders', DataKeyFiled는 'OrderID'로 각각 지정한다.

    DataList 컨트롤의 템플릿을 구성하기 위해 컨텍스트 메뉴에서 '템플릿 편집-항목 템플릿'을 선택한다.

    템플릿 편집모드의 ItemTemplate에 Label 컨트롤을 4개 추가한다. Label의 데이터바인딩을 하기 위해 속성을 설정하자.

    (DataBindings) 확장버튼을 클릭하여 Text 프로퍼티를 설정하는데 단순바인딩을 선택하고 'DataItem-OrderID'와 같이

    바인딩할 필드를 설정해 준다.

    각 컨트롤별 서식은 다음과 같이 지정하자

    컨트롤              유형                서식

    lblOrderID          Number          {0:N}

    lblOrderDate        Long Date       {0:D}

    lblShippedDate      Short Date      {0:d}

    lblFreight          Fixed Point     {0:F2}

 

    format.aspx

 

    <form id="Form1" method="post" runat="server">

        <P><FONT face="굴림">DataBinder.Eval - format expression</FONT></P>

        <P>

        <asp:DataList id=DataList1 runat="server" DataSource="<%# dsOrders1 %>" DataMember="Orders" DataKeyField="OrderID">

            <ItemTemplate>

                <FONT face="굴림">주문번호 :

                <asp:Label id=lblOrderID runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.OrderID", "{0:N}") %>'></asp:Label><BR>

                주문일 :

                <asp:Label id=lblOrderDate runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.OrderDate", "{0:D}") %>'></asp:Label>&nbsp; 선적일 :

                <asp:Label id=lblShippedDate runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.ShippedDate", "{0:d}") %>'></asp:Label><BR>

                운임 :

                <asp:Label id=lblFreight runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Freight", "{0:F2}") %>'></asp:Label>

                </FONT>

            </ItemTemplate>

        </asp:DataList>

        </P>

    </form>

    private void Page_Load(object sender, System.EventArgs e)

    {

        if(!Page.IsPostBack)

        {

            sqlDataAdapter1.Fill(dsOrders1);

            DataList1.DataBind();

        }

    }

 

참고문헌:ASP.NET Prgoramming Bible

 

msdn : http://www.gosu.net/GosuWeb/ArticleMSView.aspx?ArticleCode=400


Posted by 뭉치냐옹
:

CheckBoxList ch=new CheckBoxList();

ListItem items=new ListItem("텍스트","벨류");
ListItem items2=new ListItem("텍스트","벨류");

ch.Items.Add(items);
ch.Items.Add(items2);

PlaceHolder1.Controls.Add(ch);

Response.Write(ch.Items[0].Value+"<br>");
Response.Write(ch.Items[1].Value+"<br>");

Posted by 뭉치냐옹
:

IFRAME 처럼 기본적으로 HTML 콘트롤에 포함되지 않는 콘트롤을 runat=server 처리를 해도...

어트리뷰트를 자유롭게 콘트롤 하기 어렵습니다.

이때... Attributes.Add() 메서드로 처리하면 간단합니다.

 

아래의 비하인드 코드의 예를 듭니다.

string oSbQuery = string.Empty;

oSbQuery.Append("../Formselect/LoadDocument.aspx").Append(this.Request.Url.Query);

this.ifrForm.Attributes.Add("src", oSbQuery.ToString());


Posted by 뭉치냐옹
:
<%@ Page Language="C#" AutoEventWireup="True" %>
<%@ Import Namespace="System.Data" %>
 
<html>
   <script runat="server">
 
      ICollection CreateDataSource() 
      {
      
         // Create sample data for the DataList control.
         DataTable dt = new DataTable();
         DataRow dr;
 
         // Define the columns of the table.
         dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
         dt.Columns.Add(new DataColumn("StringValue", typeof(String)));
         dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
         dt.Columns.Add(new DataColumn("ImageValue", typeof(String)));
 
         // Populate the table with sample values.
         for (int i = 0; i < 9; i++) 
         {
            dr = dt.NewRow();
 
            dr[0] = i;
            dr[1] = "Description for item " + i.ToString();
            dr[2] = 1.23 * (i + 1);
            dr[3] = "Image" + i.ToString() + ".jpg";
 
            dt.Rows.Add(dr);
         }
 
         DataView dv = new DataView(dt);
         return dv;
      }
 
 
      void Page_Load(Object sender, EventArgs e) 
      {

         // Load sample data only once, when the page is first loaded.
         if (!IsPostBack) 
         {
            ItemsList.DataSource = CreateDataSource();
            ItemsList.DataBind();
         }

      }
 
   </script>
 
<body>
 
   <form runat=server>

      <h3>DataList Example</h3>
 
      <asp:DataList id="ItemsList"
           BorderColor="black"
           CellPadding="5"
           CellSpacing="5"
           RepeatDirection="Vertical"
           RepeatLayout="Table"
           RepeatColumns="3"
           ShowBorder="True"
           runat="server">

         <HeaderStyle BackColor="#aaaadd">
         </HeaderStyle>

         <AlternatingItemStyle BackColor="Gainsboro">
         </AlternatingItemStyle>

         <HeaderTemplate>

            List of items

         </HeaderTemplate>
               
         <ItemTemplate>

            Description: <br>
            <%# DataBinder.Eval(Container.DataItem, "StringValue") %>

            <br>

            Price: <%# DataBinder.Eval(Container.DataItem, "CurrencyValue", "{0:c}") %>

            <br>

            <asp:Image id="ProductImage"
                 ImageUrl='<%# DataBinder.Eval(Container.DataItem, "ImageValue") %>'
                 runat="server"/>

         </ItemTemplate>
 
      </asp:DataList>
 
   </form>
 
</body>
</html>

----------------------------------------------------------------------------------------------------------------------------------              

 더간단 방법 ㅋ

 

  DataTable dt = new DataTable();
                DataRow dr;
                dt.Columns.Add("title");               
                dr = dt.NewRow();
                dr["title"] = "데이터가 없습니다.";
                dt.Rows.Add(dr);

                this.DataListTest.DataSource = dt;
                DataListTest.DataBind();

Posted by 뭉치냐옹
:

ASP.NET의 정규식

충돌 과정

Steven A. Smith

2004년 3월

적용 대상:
   Microsoft .NET Framework
   Microsoft ASP.NET
   정규식 API

요약: 정규식은 텍스트로 작업할 때 매우 유용한 도구입니다. 사용자 입력의 유효성을 검사해야 하거나, 문자열 내의 패턴을 검색해야 하거나, 효과적으로 텍스트 서식을 다시 지정해야 할 경우 정규식을 사용하면 좋습니다(14페이지/인쇄 페이지 기준).

이 기사의 소스 코드를 다운로드하십시오.

목차

소개
정규식 개요
단순식
한정사
메타 문자
문자 클래스
미리 정의된 메타 문자 집합
샘플 식
ASP.NET의 유효성 검사
정규식 API
무료 도구
고급 항목
결론
리소스
저자 소개

소개

Microsoft.NET Framework에서는 정규식을 완벽하게 지원하며, Microsoft ASP.NET 내에도 정규식 언어를 사용하는 컨트롤이 있습니다. 이 기사에서는 정규식의 기본 정보와 함께 자세한 내용을 참조할 수 있는 추가 정보를 다룹니다.

이 기사는 정규식에 대해서는 잘 몰라도 ASP.NET 및 .NET의 프로그래밍에는 익숙한 초급자를 위해 쓰여졌습니다. 이전에 정규식을 사용해 본 개발자들도 정규식 요약 과 함께 이 기사를 편리하게 참조하고 정보를 새롭게 상기할 수 있기를 바랍니다. 이 기사에서는 다음 내용을 다룹니다.

  1. 정규식 개요
  2. 단순식
  3. 한정사
  4. 메타 문자
  5. 문자 클래스
  6. 미리 정의된 메타 문자 집합
  7. 샘플 식 세부 정보
  8. ASP.NET의 유효성 검사
  9. 정규식 API
  10. 무료 도구
  11. 고급 항목 개요
  12. 요약 및 추가 리소스

이 기사나 정규식에 대한 일반적인 의문 사항이 있을 경우 350명 이상의 가입자를 보유한 http://www.aspadvice.com/ regex 메일 그룹 에서 질문하십시오.

정규식 개요

오늘날 사용되는 정규식은 1950대에 고안되었습니다. 원래 정규식은 신경 생리학자들의 연구 시 패턴이었던 "정규 집합"을 설명하는 데 사용되었습니다. 최초로 정규식을 만든 사람은 수학자 Stephen Kleene입니다. 이후에 Ken Thompson은 매우 일반적인 텍스트 유틸리티인 QED 및 GREP에 정규식을 도입했습니다. Jeffrey Friedl은 그의 저서 Mastering Regular Expressions(2판)에서 더 심도 있게 다루었습니다. 정규식의 이론과 개요에 대해 자세히 배우려는 분들께 이 책을 권장합니다.

지난 50년 동안 정규식은 불명확한 수학적 개념에서 많은 도구와 소프트웨어 패키지의 주요 기능으로 서서히 변화해 왔습니다. 수십 년 동안 많은 UNIX 도구에서 정규식을 지원했지만 정규식이 대부분의 Windows 개발자 도구 키트로서 제대로 자리잡기 시작한 것은 10년 정도 밖에 되지 않았습니다. Microsoft Visual Basic 6 또는 Microsoft VBScript에서는 정규식을 사용하기가 다소 불편했지만 새로 출시된 .NET Framework에서는 정규식을 완벽하게 지원하게 되어 모든 Microsoft 개발자가 모든 .NET 언어에 정규식을 사용할 수 있게 되었습니다.

그러면 정규식이란 무엇일까요? 정규식은 텍스트 문자열에서 패턴을 명시적으로 설명하는 데 사용할 수 있는 언어입니다. 이러한 패턴을 단순히 설명하는 것 외에도 일반적으로 정규식 엔진을 사용하면 일치 항목을 반복하거나 패턴을 구분 기호로 사용하여 문자열을 하위 문자열로 구문 분석하거나 지능적인 방식으로 텍스트를 바꾸거나 형식을 다시 지정할 수 있습니다. 또한 정규식을 사용하여 강력하고 간단한 방식으로 텍스트 처리와 관련된 많은 일반 작업을 해결할 수 있습니다.

정규식에 대해 설명할 때는 정규식과 일치하거나 일치하지 않는 텍스트를 기준으로 분석하는 것이 일반적입니다. 이 기사와 System.Text.RegularExpressions 클래스에서는 정규식 상호 작용의 3가지 항목인 정규식 패턴, 입력 문자열 및 패턴이 문자열 내에 만드는 일치에 대해 설명하도록 하겠습니다.

단순식

가장 단순한 정규식은 이미 친숙해 있는 정규식인 리터럴 문자열입니다. 특정 문자열을 문자 그대로 설명할 수 있으므로 foo와 같은 정규식 패턴은 입력 문자열 foo와 정확히 한 번 일치합니다. 이러한 경우 이 문자열은 The food was quite tasty 입력과도 일치합니다. 그러나 정확히 일치하는 항목만 찾을 경우 이 입력을 원하지 않을 수 있습니다.

물론 자신과 정확히 일치하는 문자열을 찾는 것은 일반적인 정규식 구현의 결과일 뿐 강력한 기능이라고 말할 수는 없습니다. foo 대신 f로 시작하는 모든 단어를 찾으려는 경우 또는 3자로 된 단어를 찾으려는 경우는 어떨까요? 이 정도 조건이라면 이미 리터럴 문자열로 수행할 수 있는 작업의 범위는 넘어 선 것입니다. 이제 정규식에 대해 더 자세히 배워야 합니다. 다음은 샘플 리터럴 표현식 및 일치하는 일부 입력입니다.

패턴 입력(일치 항목)
foo foo, food, foot, "There's evil afoot."

한정사

한정사를 사용하면 패턴 내에 특정 문자 또는 문자 집합을 반복할 수 있는 횟수를 간단히 지정할 수 있습니다. 다음과 같은 3가지 비명시적 한정사가 있습니다.

  1. *는 "0개 이상의 항목"을 나타냅니다.
  2. +는 "1개 이상의 항목"을 나타냅니다.
  3. ?는 "0개 또는 1개의 항목"을 나타냅니다.

한정사는 항상 한정사 바로 앞(왼쪽)에 있는 패턴을 참조합니다. 패턴 그룹을 만드는 데 괄호가 사용되지 않은 경우 이 한정사는 일반적으로 단일 문자입니다. 다음은 몇 가지 샘플 패턴 및 일치하는 입력입니다.

패턴 입력(일치 항목)
fo* foo, foe, food, fooot, "forget it", funny, puffy
fo+ foo, foe, food, foot, "forget it"
fo? foo, foe, food, foot, "forget it", funny, puffy

주어진 패턴이 정확히 0번 또는 한 번 발생할 수 있도록 지정하는 것 외에도 ? 문자는 입력 문자열에서 여러 개가 일치할 수 있을 경우 패턴 또는 하위 패턴이 최소 문자 수와 일치하도록 지정합니다.

비명시적 한정사(일반적으로 간단히 한정사라고 하지만 다음 그룹과 구분하기 위함) 외에도 명시적 한정사가 있습니다. 한 가지 패턴으로 발생할 수 있는 횟수와 관련하여 한정사가 모호할 경우 명시적 한정사를 사용하면 정확한 수, 범위 또는 숫자 집합을 지정할 수 있습니다. 정규 한정사와 같이 명시적 한정사는 적용되는 패턴 다음에 위치합니다. 명시적 한정사는 중괄호{} 및 숫자 값을 사용하여 이 괄호 안에 상한 및 하한 발생 수를 지정합니다. 예를 들어 x{5}는 x 문자 5개(xxxxx)와 일치합니다. 숫자 한 개만 지정한 경우 x{5,}와 같이 뒤에 쉼표를 입력하지 않는 한 상한으로 사용됩니다(개수에 상관없이 4개 이상의 x 문자와 일치).

패턴 입력(일치 항목)
ab{2}c abbc, aaabbccc
ab{,2}c ac, abc, abbc, aabbcc
ab{2,3}c abbc, abbbc, aabbcc, aabbbcc

메타 문자

정규식에서 특별한 의미가 있는 구성을 메타 문자라고 합니다. 앞서*, ?, +, { } 문자 등의 여러 메타 문자에 대해 이미 살펴 보았습니다. 기타 여러 문자는 정규식의 언어로 특별한 의미가 있습니다. 이러한 문자에는 $ ^ . [ ( | ) ] \ 등이 있습니다.

.(마침표 또는 점) 메타 문자는 가장 단순하면서도 가장 많이 사용되는 문자 중 하나입니다. 이 문자는 어떤 단일 문자와도 일치하며, 특정 패턴에 문자 조합이 포함될 수 있지만 한정사를 사용하여 특정 길이 범위 내에 속하도록 지정하는 데 유용합니다. 또한 긴 문자열 내에서 설명하는 패턴의 인스턴스에 식이 일치하는 것도 살펴 보았습니다. 그러나 패턴과 정확히 일치하도록 하려면 어떻게 해야 할까요? 이러한 경우는 우편 번호나 전화 번호에 적합한 형식으로 입력했는지 확인하는 경우와 같이 유효성 검사 시나리오에 자주 일어납니다. ^ 메타 문자는 문자열 또는 줄의 처음을 지정하는 데 사용되며 $ 메타 문자는 문자열이나 줄의 끝을 지정하는 데 사용됩니다. 이러한 문자를 패턴의 처음과 끝에 추가하면 패턴에 정확히 일치하는 입력 문자열에만 일치하도록 할 수 있습니다. 또한 ^ 메타 문자는 대괄호 [ ]로 지정되는 문자 클래스의 처음에 사용될 경우 특별한 의미가 있습니다. 이 내용은 아래에서 설명하겠습니다.

\(백슬래시) 메타 문자는 문자가 특별한 의미를 가지지 않도록 하는 데 사용되며 미리 정의된 메타 문자 집합의 인스턴스를 지정하는 데 사용됩니다. 이 내용도 아래에서 설명하겠습니다. 정규식이 메타 문자의 리터럴 버전을 포함하도록 하려면 백슬래시를 사용하여 특정 의미를 해제해야 합니다. 그러므로 인스턴스에 대해 "c:\"로 시작하는 문자열과 일치시키려는 경우 ^c:\\를 사용할 수 있습니다. 여기서 ^ 메타 문자를 사용하여 문자열이 이 패턴으로 시작되도록 지정했으며 백슬래시 메타 문자를 사용하여 리터럴 백슬래시를 해제했다는 점에 유의하십시오.

|(파이프) 메타 문자는 교체에 사용되며 기본적으로 패턴에서 'A 또는 B'를 지정합니다. 그러므로 a|b와 같은 입력은 'a' 또는 'b'가 포함된 어떤 내용에도 일치하며 문자 클래스 [ab]와 매우 비슷합니다.

마지막으로, 괄호 ( )는 패턴을 그룹화하는 데 사용됩니다. 가독성만을 위해 한정사를 사용하여 전체 패턴이 여러 번 발생하도록 허용하거나 입력의 특정 부분이 개별적으로 일치하도록 하여 서식을 다시 지정하거나 구문 분석을 수행하기 위해 패턴을 그룹화할 수 있습니다.

다음은 메타 문자 사용의 예를 보여 줍니다.

패턴 입력(일치 항목)
. a, b, c, 1, 2, 3
.* Abc, 123, 모든 문자열, 심지어 문자가 없어도 일치
^c:\\ c:\windows, c:\\\\\, c:\foo.txt, c:\ 다음에 오는 임의의 문자
abc$ abc, 123abc, abc로 끝나는 모든 문자열
(abc){2,3} abcabc, abcabcabc

문자 클래스

문자 클래스는 대괄호 [ ]로 둘러 쌓여 정의되는 것으로, 정규식 내의 소언어입니다. 가장 단순한 문자 클래스는 [aeiou]와 같이 단순히 괄호 안에 있는 문자 목록입니다. 식 안에 사용할 경우 이러한 문자 중 하나를 패턴 내의 이 위치에 사용할 수 있습니다. 그러나 한정사를 사용하지 않을 경우에 한하여 한 번만 사용할 수 있습니다. 문자 클래스를 사용할 경우 단어나 패턴은 정의할 수 없으며 단일 문자만 정의할 수 있습니다.

숫자를 지정하려면 문자 클래스 [0123456789]를 사용할 수 있습니다. 그러나 이렇게 길게 쓰면 오히려 사용하기 불편할 수 있으므로 하이픈 문자(-)를 사용하여 괄호 안에 문자 범위를 정의할 수 있습니다. 이 하이픈 문자는 문자 클래스에서만 특별한 의미가 있을 뿐 정규식에서는 별다른 의미가 없으므로 정규식 메타 문자로 정확히 한정하지는 않습니다. 또한 문자 클래스에서도 첫 문자가 아닌 경우에만 특별한 의미가 있습니다. 하이픈을 사용하여 숫자를 지정하려면 [0-9]를 사용합니다. 마찬가지로 소문자의 경우 [a-z]를 사용하고 대문자의 경우 [A-Z]를 사용하면 됩니다. 하이픈으로 정의되는 범위는 사용 중인 문자 집합에 따라 다르므로 ASCII 또는 유니코드 테이블 등에서의 문자 순서는 해당 범위에 포함되는 문자를 결정합니다. 범위에 하이픈을 포함해야 할 경우에는 첫 문자로 지정합니다. 예를 들어 [-.? ]는 이 4개 문자 중 하나와 일치합니다(마지막 문자는 공백). 또한 정규식 메타 문자는 문자 클래스 내에서 특별하게 처리되지 않으므로 의미를 해제할 필요가 없습니다. 문자 클래스는 고유 규칙과 구문을 사용하므로 나머지 정규식과는 다른 별도의 언어로 간주해야 합니다.

또한 문자 클래스에서 캐럿(^)을 첫 문자로 사용하여 문자 클래스를 빼면 문자 클래스의 구성원을 제외하고 임의의 문자를 일치시킬 수 있습니다. 그러므로 모음이 아닌 문자를 일치시키려면 [^aAeEiIoOuU]와 같은 문자 클래스를 사용할 수 있습니다. 하이픈을 빼려는 경우 [^-]과 같이 문자 클래스에서 두 번째 문자로 입력해야 합니다. 문자 클래스에서 ^ 문자는 정규식 패턴의 첫 문자로 사용할 때와 전혀 다른 의미를 가진다는 점에 유의하십시오.

다음은 사용 중인 문자 클래스의 예를 보여 줍니다.

패턴 입력(일치 항목)
^b[aeiou]t$ Bat, bet, bit, bot, but
^[0-9]{5}$ 11111, 12345, 99999
^c:\\ c:\windows, c:\\\\\, c:\foo.txt, c:\ 다음에 오는 임의의 문자
abc$ abc, 123abc, abc로 끝나는 모든 문자열
(abc){2,3} abcabc, abcabcabc
^[^-][0-9]$ 0, 1, 2, … (-0, -1, -2 등과 일치하지 않음)

다음 버전의 .NET Framework에서 새 기능인 코드 이름 "Whidbey"가 문자 클래스 빼기라는 문자 클래스에 추가될 예정입니다. 기본적으로 이 기능을 사용하면 한 문자 클래스에서 다른 문자 클래스를 뺄 수 있으므로 일부 패턴을 보다 편리하게 설명할 수 있습니다. 이 지정 사항은 현재 http://www.gotdotnet.com/team/clr/bcl/TechArticles/techarticles/Specs/Regex/CharacterClassSubtraction.doc 에서 볼 수 있습니다. 모든 소문자와 일치하는 구문은 [a-z-[aeiou]]와 같습니다.

미리 정의된 메타 문자 집합

지금까지 설명한 도구를 사용하여 수많은 작업을 수행할 수 있습니다. 그러나 패턴에서 모든 숫자에 대해 [0-9]라고 사용하는 것도 길다고 볼 수 있으며 영숫자 문자에서 [0-9a-zA-Z]와 같이 사용할 경우에는 더 불편합니다. 이와 같이 일반적이지만 매우 긴 패턴의 불편함을 없애기 위해 메타 문자 집합을 미리 정의했습니다. 정규식을 다르게 구현하면 미리 정의된 메타 문자 집합도 다르게 정의됩니다. 여기서 설명하는 메타 문자 집합은 .NET Framework의 System.Text.RegularExpressions API에서 지원됩니다. 미리 정의된 이러한 메타 문자의 표준 구문은 백슬래시(\) 다음에 하나 이상의 문자를 입력하는 것입니다. 대부분의 미리 정의된 메타 문자 길이는 문자 하나이므로 쉽게 사용할 수 있고 긴 문자 클래스 대신에 편리하게 사용할 수 있습니다. 두 가지 예로, 임의의 숫자와 일치하는 \d와 단어 문자(영숫자와 밑줄)와 일치하는 \w가 있습니다. 유니코드 캐리지 리턴 문자와 일치하는 \u000D와 같이, 일치하는 문자의 주소를 지정해야 하는 특수 문자 코드 일치는 예외입니다. 가장 일반적으로 사용하는 문자 클래스와 해당 메타 문자는 다음과 같습니다.

메타 문자 해당 문자 클래스
\a 벨(경보)과 일치합니다. \u0007
\b 문자 클래스 안에 사용되는 경우를 제외하고 단어 경계와 일치합니다. 백슬래시 문자 \u0008과 일치합니다.
\t 탭과 일치합니다. \u0009
\r 캐리지 리턴과 일치합니다. \u000D
\w 세로 탭과 일치합니다. \u000B
\f 용지 공급과 일치합니다. \u000C
\n 새 행과 일치합니다. \u000A
\e 이스케이프와 일치합니다. \u001B
\040 세 자리 8진수를 사용하는 ASCII 문자와 일치합니다. \040은 공백을 나타냅니다(십진수 32).
\x20 두 자리 16진수를 사용하는 ASCII 문자와 일치합니다. 이 경우 \x2-는 공백을 나타냅니다.
\cC ASCII 컨트롤 문자와 일치합니다. 이 경우 ctrl-C입니다.
\u0020 정확히 4자리 16진수를 사용하는 유니코드 문자와 일치합니다. 이 경우 \u0020은 공백입니다.
\* 미리 정의된 문자 클래스를 나타내지 않는 문자는 단순히 해당 문자로 처리됩니다. 그러므로 \*\x2A와 같습니다(*는 메타 문자가 아니라 리터럴임).
\p{name} 명명된 문자 클래스 'name'에 있는 임의의 문자와 일치합니다. 지원되는 이름은 유니코드 그룹 및 블록 범위입니다. 예를 들어 Ll, Nd, Z, IsGreek, IsBoxDrawing 및 Sc(통화)와 같습니다.
\P{name} 명명된 문자 클래스 'name'에 포함되지 않은 텍스트와 일치합니다.
\w 임의의 단어 문자와 일치합니다. 비유니코드 및 ECMAScript 구현의 경우 [a-zA-Z_0-9]와 같습니다. 유니코드 범주에서는 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]와 같습니다.
\W \w를 빼고, ECMAScript 규격 집합 [^a-zA-Z_0-9] 또는 유니코드 문자 범주 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]와 같습니다.
\s 공백 문자와 일치합니다. 유니코드 문자 클래스 [\f\n\r\t\v\x85\p{Z}]와 같습니다. ECMAScript 옵션을 사용하여 ECMAScript 규격 동작을 지정한 경우 \s는 [ \f\n\r\t\v](선행 공백이 있음)와 같습니다.
\S 공백이 아닌 문자와 일치합니다. 유니코드 문자 범주 [^\f\n\r\t\v\x85\p{Z}]와 같습니다. ECMAScript 옵션을 사용하여 ECMAScript 규격 동작을 지정한 경우 \S는 [^ \f\n\r\t\v](^ 다음에 공백이 있음)와 같습니다.
\d 십진수와 일치합니다. 유니코드의 경우 [\p{Nd}]와 같고, 비유니코드 ECMAScript 동작의 경우 [0-9]와 같습니다.
\D 십진수가 아닌 숫자와 일치합니다. 유니코드의 경우 [\P{Nd}]와 같고, 비유니코드 ECMAScript 동작의 경우 [^0-9]와 같습니다.

샘플 식

대부분의 경우 예를 들어 설명할 때 가장 효과적으로 이해할 수 있으므로 여기서 몇 가지 샘플 식을 보여 드리겠습니다. 더 많은 샘플 식을 보려면 온라인 정규식 라이브러리 http://www.regexlib.com/ 을 방문하십시오.

패턴 설명
^\d{5}$ 미국 우편 번호와 같은 5자리 숫자입니다.
^(\d{5})|(\d{5}-\d{4}$ 5자리 숫자 또는 5자리 숫자-대시-4자리 숫자입니다. 미국 우편 번호 또는 미국 우편 번호+4 형식과 일치합니다.
^(\d{5}(-\d{4})?$ 앞의 예와 같지만 더 효율적입니다. ?를 사용하면 교체를 통해 별도의 패턴 두 개를 개별적으로 비교해야 하는 대신에 패턴의 4자리 부분을 선택적으로 입력할 수 있습니다.
^[+-]?\d+(\.\d+)?$ 실수와 일치하며 선택적으로 기호를 사용할 수 있습니다.
^[+-]?\d*\.?\d*$ 위의 예와 같지만 빈 문자열에도 일치합니다.
^(20|21|22|23|[01]\d)[0-5]\d$ 24시간 값과 일치합니다.
/\*.*\*/ C 스타일 주석 /* … */의 내용과 일치합니다.

ASP.NET의 유효성 검사

ASP.NET에서는 이전 ASP(또는 클래식 ASP)를 사용할 때보다 훨씬 쉽게 웹 양식 입력의 유효성을 검사하는 유효성 검사 컨트롤 집합을 제공합니다. 가장 강력한 유효성 검사기 중 하나는 RegularExpressionValidator입니다. 이 검사기는 입력과 일치해야 하는 정규식을 제공하여 입력의 유효성을 검사할 수 있습니다. 정규식 패턴은 컨트롤의 ValidationExpression 속성을 설정하여 지정합니다. 다음은 우편 번호 필드의 유효성 검사기 예를 보여 줍니다.

<asp:RegularExpressionValidator runat="server" id="ZipCodeValidator" 
ControlToValidate="ZipCodeTextBox" ErrorMessage="잘못된 우편 번호입니다. 
format; format should be either 12345 or 12345-6789."  
ValidationExpression="(\d{5}(-\d{4})?" />(참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.)

다음은 RegularExpressionValidator에 대해 알아 두어야 할 사항입니다.

  • 유효성 검사 중인 컨트롤에서 빈 문자열로 활성화할 수 없습니다. RequiredFieldValidator에서만 빈 문자열을 인식합니다.
  • 문자열의 처음과 끝에 일치 문자 ^$가 가정되므로 따로 지정할 필요가 없습니다. 하지만 단지 불필요한 것일 뿐 이 문자를 추가해도 손상되거나 변경되는 것은 없습니다.
  • 모든 유효성 검사 컨트롤과 마찬가지로 이 유효성 검사는 클라이언트 쪽과 서버 쪽 모두에서 수행됩니다. 정규식이 ECMAScript 규격이 아닌 경우 클라이언트에서 실패합니다. 이 문제를 방지하려면 식이 ECMAScript 규격인지 확인하거나 서버에서만 유효성 검사를 수행하도록 컨트롤을 설정합니다.

정규식 API

ASP.NET 유효성 검사 컨트롤을 제외하고 .NET에서 정규식을 사용하는 대부분의 경우 System.Text.RegularExpressions 네임스페이스에 있는 클래스를 사용합니다. 특히 잘 알고 있어야 하는 주요 클래스는 Regex, MatchMatchCollection입니다.

중요하지 않은 문제이지만, 정규식의 약어인 regex를 /reg-eks/로 발음할 것인지 또는 /rej-eks/로 발음할 것인지에 관한 란이 있습니다. 개인적으로 후자를 선호하지만 두 가지 경우 모두 전문가들이 주장하고 있으므로 원하는 발음을 사용하면 됩니다.

Regex 클래스에는 풍부한 메서드와 속성이 있습니다. 이전에 이 클래스를 사용해 본 적이 없을 경우 약간 어렵다고 생각할 수도 있을 것입니다. 다음은 가장 자주 사용되는 메서드를 요약한 것입니다.

메서드 설명
Escape / Unescape 식에서 리터럴로 사용하기 위해 문자열에서 메타 문자 의미를 해제합니다.
IsMatch 입력 문자열에서 일치하는 항목을 찾을 경우 True를 반환합니다.
Match 입력 문자열에서 일치하는 항목을 찾을 경우 Match 개체를 반환합니다.
Matches 입력 문자열에서 찾은 일치 항목이 모두 포함된 MatchCollection 개체를 반환합니다.
Replace 입력 문자열에서 일치하는 항목을 지정된 바꾸기 문자열로 바꿉니다.
Split 입력 문자열을 regex 일치 항목으로 구분하여 배열 요소로 나눔으로써 문자열 배열을 반환합니다.

많은 메서드 외에도, 주로 Regex 개체의 생성자에서 지정할 수 있는 수많은 옵션이 있습니다. 이러한 옵션은 비트 마스크의 일부이므로 OR를 사용할 수 있습니다. 즉, Multiline과 Singleline을 동시에 사용할 수 있습니다.

옵션 설명
Compiled 루프에서 많은 일치 작업을 수행할 경우 이 옵션을 사용합니다. 이 옵션을 사용하면 각 반복 작업에서 식의 구문 분석 단계를 줄일 수 있습니다.
Multiline 입력 문자열에 몇 줄이 있는지와 아무 상관이 없습니다. 오히려 이 옵션은 단순히 ^$의 동작을 수정하므로 전체 입력 문자열의 시작과 끝 대신 BOL 및 EOL과 일치합니다.
IgnoreCase 패턴에서 검색 문자열을 일치시킬 때 대/소문자를 무시합니다.
IgnorePatternWhitespace 패턴에 원하는 수만큼 공백을 넣을 수 있으며 (?# comment #) 구문을 사용하여 패턴 내 주석을 사용할 수 있게 합니다.
SingleLine 입력 문자열에 몇 줄이 있는지와 아무 상관이 없습니다. 오히려 .(마침표) 메타 문자가 \n을 제외하고 모든 문자와 일치(기본값)하는 대신, 임의의 문자와 일치하도록 만듭니다.

정규식을 사용할 수 있는 몇 가지 일반적인 작업에는 유효성 검사, 일치 및 바꾸기가 있습니다. 대부분의 경우 이 작업은 Regex 클래스의 정적 메서드를 사용하여 수행할 수 있으며 Regex 클래스 자체를 인스턴스화할 필요가 없습니다. 유효성 검사를 수행하려면 올바른 식을 만들거나 찾아서 Regex 클래스의 IsMatch() 메서드를 사용하여 입력 문자열에 적용하기만 하면 됩니다. 예를 들어 다음 함수는 정규식을 사용하여 우편 번호의 유효성을 검사하는 방법을 보여 줍니다.

private void ValidateZipButton_Click(object sender, System.EventArgs e)
{
   String ZipRegex = @"^\d{5}$";
   if(Regex.IsMatch(ZipTextBox.Text, ZipRegex))
   {
      ResultLabel.Text = "우편 번호가 유효합니다!";
   }
   else
   {
      ResultLabel.Text = "우편 번호가 잘못되었습니다!";
   }
}

마찬가지로, 다음과 같이 정적 Replace() 메서드를 사용하여 일치하는 항목을 특정 문자열로 바꿀 수 있습니다.

String newText = Regex.Replace(inputString, pattern, replacementText);

마지막으로, 다음과 같은 코드를 사용하여 입력 문자열에서 일치하는 항목 집합을 반복할 수 있습니다.

private void MatchButton_Click(object sender, System.EventArgs e)
{
   MatchCollection matches = Regex.Matches(SearchStringTextBox.Text, 
MatchExpressionTextBox.Text);
   MatchCountLabel.Text = matches.Count.ToString();
   MatchesLabel.Text = "";
   foreach(Match match in matches)
   {
      MatchesLabel.Text += "Found " + match.ToString() + " at 
position " + match.Index + ".<br>";
   }
}

기본 동작 외에 다른 동작을 지정해야 할 경우 일반적으로 Regex 클래스의 인스턴스를 인스턴스화해야 합니다. 특히 설정 옵션의 경우가 그렇습니다. 예를 들어 대/소문자와 패턴 공백을 무시하는 Regex 인스턴스를 만들고 해당 식에 대해 일치하는 항목 집합을 검색하려면 다음 코드를 사용합니다.

Regex re = new Regex(pattern, 
   RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = re.Matches(inputString);

이 샘플의 전체 작업 버전은 다운로드한 이 기사에 단순 ASP.NET 페이지로 포함되어 있습니다.

무료 도구

Regulator(http://royo.is-a-geek.com/iserializable/regulator/ ) - 클라이언트 쪽에서 실행하도록 만들어진 정규식 테스트 도구로서, 웹 서비스를 통해 RegexLib과 통합되며 일치, 분할, 바꾸기 등을 지원합니다. 성능 분석 및 구문 강조가 포함됩니다.

RegexDesigner.NET(http://www.sellsbrothers.com/tools/ ) - 정규식을 구성하고 테스트할 수 있는 강력한 비주얼 도구입니다. C# 및/또는 VB.NET 코드 및 컴파일된 어셈블리를 생성하여 식을 응용 프로그램에 쉽게 통합할 수 있게 합니다.

Regular Expression Workbench v2.0(http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=C712F2DF-B026-4D58-8961-4EE2729D7322 ) - 정규식을 만들고 테스트하고 연구할 수 있는 Eric Gunnerson의 도구입니다. 마우스로 regex를 가리켜 그 의미를 디코딩할 수 있는 "Examine-o-matic" 기능이 들어 있습니다.

고급 항목

여기서 주목할 만한 두 가지의 정규식 기능은 명명된 그룹 및 둘러보기 처리(lookaround processing)입니다. 하지만 이 두 가지 항목은 자주 사용되는 것이 아니므로 여기서는 간략하게만 설명하겠습니다.

명명된 그룹을 사용할 경우 일치하는 개별 그룹에 이름을 지정하고 식 내에서 프로그래밍 방식으로 이러한 그룹을 참조할 수 있습니다. 입력 문자열에서 요소의 순서와 배치를 다시 정렬하여 입력 문자열의 서식을 바꿀 때 Replace 메서드와 함께 사용하면 특히 유용합니다. 예를 들어 MM/DD/YYYY 문자열 형식으로 지정된 날짜를 DD-MM-YYYY 형식으로 바꾸려는 경우를 가정해 봅니다. 첫 번째 형식을 캡처하고 해당 Matches 컬렉션을 반복한 다음 문자열 처리를 사용하는 식을 써서 바꾸기 문자열을 만들 수 있습니다. 이 식에는 어느 정도의 코드 및 처리가 필요합니다. 명명된 그룹을 사용하여 이와 같은 작업을 수행할 수 있습니다.

String MDYToDMY(String input)
{
   return Regex.Replace(intput, @"\b(?<month>\d{1,2})/(?<day>\d{1,2}/(?<year>\d{4})\b", "${day}-
${month}-${year}");
}

또한 이름뿐 아니라 번호로도 그룹을 참조할 수 있습니다. 모든 이벤트에서 이러한 참조를 역참조라고 합니다. 또한 일반적으로 역참조는 반복되는 문자를 찾기 위한 [a-z]\1 식과 같이 일치하는 식 자체 내에서 많이 사용됩니다. 이 식은 'aa', 'bb', 'cc' 등과는 일치하지만 'ab', 'ac' 등 모든 두 글자 조합에 해당하거나 이를 허용하는 [a-z]{2} 또는 [a-z][a-z]와는 다릅니다. 역참조를 사용하면 식에서 이미 구문 분석하고 일치시킨 입력 문자열의 일부에 대해 기억할 수 있습니다.

"둘러보기 처리"는 많은 정규식 엔진에서 지원하는 긍정적, 부정적 예측 및 분석 기능을 참조합니다. 모든 정규식 엔진에서 둘러보기 처리의 모든 변형을 지원하는 것은 아닙니다. 이 구성은 문자와 일치할 수 있지만 문자를 사용하지는 않습니다. 일부 패턴은 둘러보기 처리를 사용하지 않고 설명할 수 없습니다. 특히 패턴 일부의 존재가 다른 부분의 존재에 따라 결정되는 경우에는 더욱 그렇습니다. 각 둘러보기 기능의 구문은 다음과 같습니다.

구문 설명
(?=…) 긍정적 예측(Positive Lookahead)
(?!...) 부정적 예측(Negative Lookahead)
(?<=…) 긍정적 분석(Positive Lookbehind)
(?<!...) 부정적 분석(Negative Lookbehind)

둘러보기 처리를 사용해야 하는 경우의 예로는 암호 유효성 검사가 있습니다. 적어도 숫자가 하나 이상 포함된 4자에서 8자 사이의 암호를 입력해야 하는 암호 제한을 가정해 봅니다. 일치 항목에 대해 \d를 테스트하고 문자열 작업을 사용하여 길이를 테스트함으로써 이 작업을 수행할 수 있지만 정규식에서 전체를 수행하려면 둘러보기가 필요합니다. 다음 식이 나타내는 것과 같이 특히 긍정적 예측의 경우 더욱 그렇습니다. ^(?=.*\d).{4,8}$

결론

정규식을 사용하면 텍스트의 패턴을 효과적으로 설명할 수 있으므로 문자열 유효성 검사와 처리를 위한 리소스로 활용할 수 있습니다. .NET Framework는 System.Text.RegularExpressions 네임스페이스를 비롯하여, 특히 Regex 클래스에서 정규식을 완벽하게 지원합니다. API는 사용하기가 간편하지만 올바른 정규식을 사용하는 것이 때로는 어려운 일입니다. 다행히 정규식은 재사용률이 매우 높으며 많은 온라인 리소스에서 다른 사용자가 지정한 식을 찾아서 활용할 수도 있고, 만들기 어려운 정규식에 대해 도움도 받을 수 있습니다.

리소스

정규식 라이브러리 http://www.regexlib.com/ 

정규식 토론 목록 http://aspadvice.com/login.aspx?ReturnUrl=%2fSignUp%2flist.aspx%3fl%3d68%26c%3d16&l=68&c=16 

정규식 포럼 http://forums.regexadvice.com/ 

정규식 웹 로그 http://blogs.regexadvice.com/ 

Jeffrey Friedl의 Mastering Regular Expressions(O'Reilly) http://www.regex.info/ 

.NET 정규식 참조 http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextRegularExpressions.asp 

Jscript 정규식 구문 http://www.msdn.microsoft.com/library/en-us/script56/html/js56jsgrpRegExpSyntax.asp 

정규식 정보 http://www.regular-expressions.info/ 

저자 소개

Microsoft ASP.NET MVP인 Steven A. Smith는 ASPAlliance.com 및 DevAdvice.com의 사장이자 소유자입니다. 또한 .NET 중심 교육 기관인 ASPSmith Ltd의 소유자이자 대표 강사로, MSDN 및 AspNetPRO 잡지에 실리는 기사뿐 아니라 ASP.NET Developer's Cookbook과 ASP.NET By Example 두 권의 책을 저술한 바 있습니다. 또한 매년 열리는 여러 회의에서 강연을 맡고 있고 INETA 강연자 협회의 회원이며, 경영학 석사 및 컴퓨터 과학 기술 학사 학위를 소지하고 있습니다.

전자 메일(ssmith@aspalliance.com)을 통해 저자와 연락할 수 있습니다.


Posted by 뭉치냐옹
: