'JAVA/Regular Expression'에 해당되는 글 3건

  1. 2013.03.22 replaceAll 정규식 팁!
  2. 2013.03.06 Java 정규 표현식 사용하기
  3. 2013.03.04 정규식과 보안
JAVA/Regular Expression2013. 3. 22. 17:31

HTML 을 XML 파서로 파싱해서 객체화 시킬 일이 있어 여러 가지 실험해 보다가 쓸만한 팁을 정리합니다.

HTML 의 경우는 XML 과는 다르게 태그를 닫지 않거나 attribute 를 큰 따옴표로 감싸지 않아도 브라우저에서 확인이 가능합니다. 이렇기 때문에 HTML 을 XML 파서로 파싱하려면 큰 따옴표로 묶이지 않은 부분을 변경해 주어야 합니다.
(실제로 작업을 해보지는 않았으나 태그를 닫지 않는 것을 수정하려면 문서 전체를 문자열 단위로 파싱을 해야 가능할 것 같습니다.)

[TYPE_A]

<P class=PStyle0>
...
</P>


[TYPE_B]

<P class="PStyle0">
...
</P>


간단하게 이야기 하자면 [TYPE_A][TYPE_B] 로 변경하는 것이 목적입니다.

자바에서는 replaceAll 메소드와 정규식을 이용하면 쉽게 변환이 가능합니다.

1 String html = "...";
2   
3 String replaceHtml = html.replaceAll("(class=)([^\\p{Space}\\>\\\"]+)", "$1\"$2\"");


우선 replaceAll 의 첫번째 파라미터를 설명하겠습니다.
'class='로 시작을 하고 스페이스, '>', 큰 따옴표가 나오기 전까지의 모든 문자들의 연속을 찾습니다. 괄호로 묶음은 그룹을 뜻하는데 여기서 그룹 1 은 'class=' 이며, 그룹 2 는 위의 [TYPE_A] 에서 라면 'PStyle0' 까지 입니다.

두번째 파라미터는 간단합니다. '$그룹번호' 로 변경하겠다는 이야기 입니다.
'$1\"$2\"' 을 단계별로 변환하면 그룹 1 이 교체되면 'class=\"$2\"' 가 되고 그룹 2 가 교체되면 'class=\"PStyle0\"' 이 됩니다.

정규식은 역시 활용만 잘하면 단순 노가다 작업을 간단하게 줄여줄 수 있는 강력한 무기가 됩니다.

 

출처: http://vicki.tistory.com/851

'JAVA > Regular Expression' 카테고리의 다른 글

Java 정규 표현식 사용하기  (0) 2013.03.06
정규식과 보안  (0) 2013.03.04
Posted by iWithJoy
JAVA/Regular Expression2013. 3. 6. 13:58

어플리케이션들을 만들다 보면 종종 단어 검색, 메일 주소 점검, XML 문서의 무결성 확인 등과 같은 복잡한 문자열 처리 기능이 필요한 경우가 있게 마련이다. 이런 때에 패턴 매칭(pattern matching)이 자주 사용된다. Perl과 sed, awk와 같은 언어들은 일치하는 텍스트를 검색하기 위해, 패턴을 정의하는 문자들과 정규표현식을 사용해 향상된 패턴 매칭 능력을 제공해 주고 있다. 자바에서 패턴 매칭을 사용하려면 StringTokenizer 클래스와 수많은 charAt, substring 메소드를 동원해야만 한다. 하지만 이런 방식은 종종 아주 복잡하고 지저분한 코드를 만들어내곤 한다.

 

하지만모두지금까지의이야기일Java 2 Platform, Standard Edition(J2SE)1.4넘어오면서정규표현식을다룰있는java.util.regex라는새로운패키지가추가되었다.이제자바에도정규표현식의강력함을맛볼있는메타캐릭터들을사용할있게되었다.

 

이번글에서는정규표현식에대해간단히설명하고,아래의과정에따라java.util.regex패키지를통해정규표현식을활용하는방법에대해자세히설명하도록하겠다.

 

l       단어바꾸기

l       메일주소점검

l       파일에서제어문자제거

l       파일검색

 

(글의예제들을실행시켜보려면J2SE 1.4호환컴파일러와가상머신이필요함)

 

정규표현식만들기

정규표현식이란여러문자열들의공통적인특성을기술하는문자들의패턴이다. java.util.regex패키지를보면입력데이터로부터패턴을찾고수정할있는다양한방법들이제공됨을확인할있을것이다.

 

정규표현식의가장단순한형태는‘Java’, ‘programming’같은일반적인문자열이다.또한메일주소와같이특수한포맷을갖는문자열을검증등도가능하다.

 

정규표현식에는일반문자들과특수문자들이혼용되어사용된다.

 

\$

^

.

*

+

?

[

]

\.

 

 

 

 

‘\’시작하는문자열을제외한모든문자들은보통문자를의미한다.

 

특수문자들은물론고유한기능을갖고있다.예를들어‘.’경우라인종결문자를제외한어떤문자와도대응될있다.따라서정규표현식s.n‘sun’, ‘son’등과같이‘s’시작하고‘n’으로끝나는자로문자열어떤것이든있다.

 

이와같이우리는정규표현식에서제공되는여러특수문자들을통해줄의시작단어를찾거나,특정범위의문자찾기,대소문자구별없이찾기,정확히일치하는단어찾기등의작업을쉽게처리할있다.

 

java.util.regex패키지에서제공하는정규표현식은Perl언어에서의정규표현식사용법과같기때문에Perl익숙한사용자라면같은문법을그대로자바에도적용할있다.만약정규표현식에익숙하지않다면아래표가많은도움이것이다.

Construct

Matches

Characters

 

X

The characterx

\\

The backslash character

\0n

The character with octal value0n(0 <= n <= 7)

\0nn

The character with octal value0nn(0 <= n <= 7)

\0mnn

The character with octal value0mnn(0 <= m <= 3, 0 <= n <= 7)

\xhh

The character with hexadecimal value 0xhh

\uhhhh

The character with hexadecimal value 0xhhhh

\t

The tab character ('\u0009')

\n

Thenewline(line feed) character ('\u000A')

\r

The carriage-return character ('\u000D')

\f

The form-feed character ('\u000C')

\a

The alert (bell) character ('\u0007')

\e

The escape character ('\u001B')

\cx

The control character corresponding tox

 

 

Character Classes

[abc]

a,b, orc(simple class)

[^abc]

Any character excepta,b, orc(negation)

[a-zA-Z]

athroughzorAthroughZ, inclusive (range)

[a-z-[bc]]

athroughz, except forbandc:[ad-z](subtraction)

[a-z-[m-p]]

athroughz, except formthroughp:[a-lq-z]

[a-z-[^def]]

d,e, orf

 

 

Predefined Character Classes

.

Any character (may or may not match line terminators)

\d

A digit:[0-9]

\D

A non-digit:[^0-9]

\s

Awhitespacecharacter:[ \t\n\x0B\f\r]

\S

A non-whitespacecharacter:[^\s]

\w

A word character:[a-zA-Z_0-9]

\W

A non-word character:[^\w]

보다자세한설명과예제는J2SE 1.4 API문서의java.util.regex.Pattern참조하도록하자.

 

클래스와메소드

 

Pattern클래스

Pattern객체는Perl문법과비슷한형태로정의된정규표현식을나타낸다.

 

문자열로정의한정규표현식은사용되기전에반드시Pattern클래스의인스턴스로컴파일되어야한다.컴파일된패턴은Matcher객체를만드는사용되며, Matcher객체는임의의입력문자열이패턴에부합되는여부를판가름하는기능을담당한다.또한Pattern객체들은비상태유지객체들이기때문에여러개의Matcher객체들이공유할있다.

 

다음은Pattern클래스의주요메소드들에대한설명이다.

 

static Pattern compile(Stringregex):주어진정규표현식으로부터패턴을만들어낸다(이를컴파일한다표현한다).
static Matchermatcher(CharSequenceinput):
입력캐릭터시퀀스에서패턴을찾는Matcher객체를만든다.
String[] pattern():
컴파일된정규표현식을String형태로반환한다.
String[] split(CharSequenceinput):
주어진입력캐릭터시퀀스를패턴에따라분리한다.

 

/*

 * split메소드를이용해입력시퀀스를콤마(‘,’)공백문자를기준으로

 *나눈다.

 */

import java.util.regex.*;

 

public class Splitter {

   public static void main(String[] args) throws Exception {

       //이상의연속된‘,’공백문자를의미하는패턴을만든다.

       Pattern p =Pattern.compile("[,{space}]+");

       //패턴에따라입력문자열을쪼갠다.

       String[] result =

                p.split("one,two, three  four , five");

       for (inti=0;i<result.length;i++)

           System.out.println(result[i]);

   }

}

 

Matcher클래스

Matcher객체는특정한문자열이주어진패턴과일치하는가를알아보는데이용된다. Matcher클래스의입력값으로는CharSequence라는새로운인터페이스가사용되는데이를통해다양한형태의입력데이터로부터문자단위의매칭기능을지원받을있다.기본적으로제공되는CharSequence객체들은CharBuffer, String,StringBuffer클래스가있다.

 

Matcher객체는Pattern객체의matcher메소드를통해얻어진다. Matcher객체가일단만들어지면주로가지목적으로사용된다.

 

l       주어진문자열전체가특정패턴과일치하는가를판단(matches).

l       주어진문자열이특정패턴으로시작하는가를판단(lookingAt).

l       주어진문자열에서특정패턴을찾아낸다(find).

 

이들메소드는성공true실패false반환한다.

 

또한특정문자열을찾아새로운문자열로교체하는기능도제공된다.

 

appendRepalcement(StringBuffersb, String replacement)메소드는일치하는패턴이나타날때까지의모든문자들을버퍼(sb)옮기고찾아진문자열대신교체문자열(replacement)채워넣는다.또한appendTail(StringBuffersb)메소드는캐릭터시퀀스의현재위치이후의문자들을버퍼(sb)복사해넣는다.다음절에나오는예제코드를참고하도록하자.

 

CharSequence인터페이스

 

CharSequence인터페이스는다양한형태의캐릭터시퀀스에대해일관적인접근방법을제공하기위해새로생겨났다.기본적으로String,StringBuffer,CharBuffer클래스가이를구현하고있으므로적절한것을골라사용하면되며,인터페이스가간단하므로필요하면직접이를구현해새로하나만들어도된다.

 

ExampleRegexScenarios

아래코드는J2SE 1.4도큐먼트의예제를완성한것이다.

 

/*

 *코드는"One dog, two dogs in the yard."라는문자열을

 *표준출력을통해출력한다.

 */

import java.util.regex.*;

 

public class Replacement {

   public static void main(String[] args)

                        throws Exception {

       // ‘cat’이라는패턴생성

       Pattern p =Pattern.compile("cat");

       //입력문자열과함께매쳐클래스생성

       Matcher m =p.matcher("one cat," +

                      " two cats in the yard");

       StringBuffersb= newStringBuffer();

       booleanresult =m.find();

       //패턴과일치하는문자열을‘dog’으로교체해가며

       //새로운문자열을만든다.

       while(result) {

           m.appendReplacement(sb, "dog");

           result =m.find();

       }

       //나머지부분을새로운문자열끝에덫붙인다.

       m.appendTail(sb);

       System.out.println(sb.toString());

   }

}

 

메일주소포맷확인

다음코드는주어진입력시퀀스가메일주소포맷인가를판단한다.코드는가능한모든형태의메일주소를확인하는것은아니니필요하면코드를추가해사용하자.

 

/*

*메일주소에서잘못된문자검사

*/

public classEmailValidation{

  public static void main(String[] args)

                                throws Exception {

                                

     String input = "@sun.com";

     //메일주소가‘.’이나‘@’같은잘못된문자로시작하는확인

     Pattern p =Pattern.compile("^\\.|^\\@");

     Matcher m =p.matcher(input);

     if (m.find())

        System.err.println("Email addresses don't start" +

                           " with dots or @ signs.");

     //’www.’으로시작하는주소를찾는다.

     p =Pattern.compile("^www\\.");

     m =p.matcher(input);

     if (m.find()) {

       System.out.println("Email addresses don't start" +

               " with \"www.\", only web pages do.");

     }

     p =Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");

     m =p.matcher(input);

     StringBuffersb= newStringBuffer();

     booleanresult =m.find();

     booleandeletedIllegalChars= false;

 

     while(result) {

        deletedIllegalChars= true;

        m.appendReplacement(sb, "");

        result =m.find();

     }

 

m.appendTail(sb);

 

     input =sb.toString();

 

     if (deletedIllegalChars) {

        System.out.println("It contained incorrect characters" +

                          " , such as spaces or commas.");

     }

  }

}

 

파일에서제어문자제거

 

/*

*지정된파일에서제어문제를찾아제거한다.

*/

import java.util.regex.*;

importjava.io.*;

 

public class Control {

   public static void main(String[] args)

                                throws Exception {

                                

       //파일객체생성

        File fin = new File("fileName1");

       Filefout= new File("fileName2");

       //입출력스트림생성

       FileInputStreamfis=

                         newFileInputStream(fin);

       FileOutputStreamfos=

                       newFileOutputStream(fout);

 

       BufferedReaderin = newBufferedReader(

                      newInputStreamReader(fis));

       BufferedWriterout = newBufferedWriter(

                     newOutputStreamWriter(fos));

 

       //제어문자를의미하는패턴생성

       Pattern p =Pattern.compile("{cntrl}");

       Matcher m =p.matcher("");

       StringaLine= null;

       while((aLine=in.readLine()) != null) {

           m.reset(aLine);

           //제어문자들을문자열로대체

           String result =m.replaceAll("");

            out.write(result);

           out.newLine();

       }

       in.close();

       out.close();

   }

}

 

파일검색

 

/*

 * .java파일에서주석을찾아출력한다.

 */

import java.util.regex.*;

importjava.io.*;

importjava.nio.*;

importjava.nio.charset.*;

importjava.nio.channels.*;

 

public classCharBufferExample{

   public static void main(String[] args) throws Exception {

       //주석을나타내는패턴생성

       Pattern p =

           Pattern.compile("//.*$",Pattern.MULTILINE);

       

       //소스파일

       File f = new File("Replacement.java");

       FileInputStreamfis= newFileInputStream(f);

       FileChannelfc=fis.getChannel();

       

       //소스파일로부터CharBuffer생성

       ByteBufferbb =

           fc.map(FileChannel.MAP_RO, 0, (int)fc.size());

        Charsetcs=Charset.forName("8859_1");

       CharsetDecodercd=cs.newDecoder();

       CharBuffercb=cd.decode(bb);

       

       //매칭작업수행

       Matcher m =p.matcher(cb);

       while (m.find())

           System.out.println("Found comment: "+m.group());

   }

}

 

출처: 복연 [wegra@wegra.org] 자바스터디 네트워크[http://javastudy.co.kr]

'JAVA > Regular Expression' 카테고리의 다른 글

replaceAll 정규식 팁!  (0) 2013.03.22
정규식과 보안  (0) 2013.03.04
Posted by iWithJoy
JAVA/Regular Expression2013. 3. 4. 17:53

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

 

 

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

 

정규식

 

[abc]
 a, b, or c (simple class) -- a나 b나 c중의 하나
 
[^abc]
 Any character except a, b, or c (negation) -- a나 b나 c만 아니면 된다.
 
[a-zA-Z]
 a through z or A through Z, inclusive (range) -- 정규식은 대소문자를 구분한다.
 
[a-d[m-p]]
 a through d, or m through p: [a-dm-p] (union) -- 위에 것과 같다 a~d 혹은 m~p의 값이 들어오면 참이다
 
[a-z&&[def]]
 d, e, or f (intersection) -- 소문자 a~z까지 범위중 def중 하나와 같은것 이면 참이다. 즉 교집합과 같다.
 
[a-z&&[^bc]]
 a through z, except for b and c: [ad-z] (subtraction) -- 소문자 a~z까지의 범위중 b나 c가 아니면 참이다
 
[a-z&&[^m-p]]
 a through z, and not m through p: [a-lq-z](subtraction) -- 소문자 a~z까지의 범위중 m~p사의 것이 아니면 참이다.
 

 
.
 Any character (may or may not match line terminators)
 
\d
 A digit: [0-9] -- 0~9까지의 숫자 면 참
 
\D
 A non-digit: [^0-9] -- 0~9의 숫자가 아닌것이면 참
 
\s
 A whitespace character: [ \t\n\x0B\f\r]
 
\S
 A non-whitespace character: [^\s]
 
\w
 A word character: [a-zA-Z_0-9]
 
\W
 A non-word character: [^\w]
  

while(cnt != 3){

String str = sc.next();

boolean boo = str.matches("1-9"); -- 1-9만 받아들인다 equals와 같아진다.

System.out.println(boo);

cnt++;

}

   

 XY
 X followed by Y
 
X|Y
 Either X or Y
 
(X)
 X, as a capturing group -- 괄호 사용시 하나의 묶음이 된다.
 

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

 

 ip주소 자바 정규식

 

public static final String IPV4_REGEX = "\\A(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z"; 

 

public static final String IPV6_HEX4DECCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z"; 

 

public static final String IPV6_6HEX4DEC_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z";

 

 public static final String IPV6_HEXCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z"; public static final String IPV6_REGEX = "\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z";
 

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

 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>업로드 파일확장자 검사</title>
<script language=javascript>

 

function checkExt()
{

    var IMG_FORMAT = "\\.(bmp|gif|jpg|jpeg|png)$";

 

    if((new RegExp(IMG_FORMAT, "i")).test(document.form1.text1.value)) return true;

 

    alert("이미지 파일만 첨부하실 수 있습니다.   ");
    return false;
}

 

</script>
</head>
<body>
<form name=form1 method=post onsubmit="return checkExt()"

    encType="multipart/form-data">
<input type=file name=text1>
<input type=submit>
</form>
</body>
</html>

 

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

 

□ JSP

 o 취약한 파일 업로드 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
<%
String savePath="/var/www/uploads";// 업로드 디렉토리
int sizeLimit = 5 * 1024 * 1024 ;// 업로드 파일 사이즈 제한

try
MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());
Enumeration formNames=multi.getFileNames();// 폼의 이름 반환
String formName=(String)formNames.nextElement();
String fileName=multi.getFilesystemName(formName);// 파일의 이름 얻기

if(fileName == null)
out.print("Error");
 else
fileName=new String(fileName.getBytes("8859_1"),"euc-kr");
out.print("User Name : " + multi.getParameter("userName") + "<BR>");
out.print("Form Name : " + formName + "<BR>");
out.print("File Name  : " + fileName);


 catch(Exception e)
out.print("Error");
 
%> 

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


 o 안전한 파일 업로드 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
<%
String savePath="/var/www/uploads";// 업로드 디렉토리
int sizeLimit = 5 * 1024 * 1024 ; // 업로드 파일 사이즈 제한

try
MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, "euc-kr", new DefaultFileRenamePolicy());
Enumeration formNames=multi.getFileNames();  // 폼의 이름 반환
String formName=(String)formNames.nextElement();
String fileName=multi.getFilesystemName(formName); // 파일의 이름 얻기

String file_ext = fileName.substring(fileName.lastIndexOf('.') + 1);
if(!( file_ext.equalsIgnoreCase("hwp") || file_ext.equalsIgnoreCase("pdf") || file_ext.equalsIgnoreCase("jpg")) )
out.print("업로드 금지 파일");


if(fileName == null)
out.print("파일 업로드 실패");
 else
fileName=new String(fileName.getBytes("8859_1"),"euc-kr"); // 한글인코딩
out.print("File Name  : " + fileName);

 catch(Exception e)

 

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

 

download.jsp

<%@ page contentType="application;" %>

<%@ page language="java" import="java.util.*,java.io.*,java.sql.*,java.text.*" %>

<%@ include file="boardcfg.jsp" %>

<%

String mask = request.getParameter("mask");


String fileP = request.getRealPath("/")+"upload/";
String fileN1 = "", fileN2 = "";
long fSize = 0;

String queryw = " WHERE maskname = ? ";
String query = "SELECT filename, filesize from "+tableName+" " + queryw;
String query2 = "update "+tableName+" SET download = download + 1 " + queryw;

Connection pconn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
%>

<%@ include file = "db.jsp"%>

<%
pstmt = pconn.prepareStatement(query);
pstmt.setString(1,mask);
rs = pstmt.executeQuery();

if(rs.next()) {
        fileN1 = mask;
        fileN2 = rs.getString("filename");
        fileN2 = new String(fileN2.getBytes("euc-kr"),"8859_1");
        fSize = rs.getInt("filesize");
}

rs.close();
pstmt.clearParameters();

pstmt = pconn.prepareStatement(query2);
pstmt.setString(1,mask);
pstmt.executeUpdate();

pstmt.close();

} catch(Exception e){
} finally {
 if (pstmt!=null) pstmt.close();
 if (pconn!=null) pconn.close();
}

// Download file
String ut = fileP+fileN1;

File file = new File(ut); // 절대경로입니다.
byte b[] = new byte[(int)file.length()];
 String strClient=request.getHeader("User-Agent");
           if(strClient.indexOf("MSIE 5.5")>-1) {
 response.setHeader("Content-Disposition", "filename=" + fileN2 + ";");
           } else {
 response.setHeader("Content-Disposition", "attachment;filename=" + fileN2 + ";");
           }
if (fSize > 0 && file.isFile())
{
 BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
 BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
 int read = 0;
 try {
  while ((read = fin.read(b)) != -1){
             outs.write(b,0,read);
  }
  outs.close();
  fin.close();
 } catch (Exception e) {
  System.out.println(e.getMessage());
 } finally {
  if(outs!=null) outs.close();
  if(fin!=null) fin.close();
 }
}
%>

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

파일명을 특정 규칙에 맞는지 검사하는 javascript

/* 영문, 숫자, 언더바(_), 하이픈(-)만 가능 */
function checkInputFileName(fileName) {
var fileNameMatch = new RegExp(/^[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/);

if(fileNameMatch.test(fileName)) {
return true;
}
return false;
}

정규식을 이용하였기 때문에 여러가지로 응용이 가능할 듯 하다.

정규식을 살펴 보면
/^[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/
=>입력의 시작부터 A-Z, a-z, 0-9, _, - 중 하나 이상의 문자가 포함되고 . 이후에 다시 A-Z, a-z, 0-9, _, - 중 하나 이상의 문자가 포함되며 이후 입력이  종료 된다.
ex) a.b (O), aabc01.bbdd0 (O), abcc. (X) , #a.b (X)
#a.b의 경우 /[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/ 이 정규식을 적용하면 true가 되나 ^ 가 포함된 위의 정규식을 적용하면 정규식에 매칭되는 a.b 앞에 아무 문자도 없어야 하므로 false가 된다.

/ reg exp / : /를 사용하여 정규식의 시작과 끝을 알린다.
^ : 입력의 시작 부분을 찾는다.
[abc] : 괄호 안의 문자중 하나를 찾음. 예를 들어 [ab]는 "plain"의 "a"를 찾는다.
[a-z] : a부터 z를 포함하는 문자를 의미한다.
\ : 다음에 오는 문자를 특수 문자로 표시함. [a-z]는 a부터z를 의미하지만 [a\-z]는 a와 -와 z를 의미한다.
{n,[m]} : n,m은 음이 아닌 정수. 최소n번 최대 m번 일치하는 문자열

 

'JAVA > Regular Expression' 카테고리의 다른 글

replaceAll 정규식 팁!  (0) 2013.03.22
Java 정규 표현식 사용하기  (0) 2013.03.06
Posted by iWithJoy