정규식(Regular Expression)은 문자열 패턴 일치를 위한 효율적이고 편리한 방법을 제공합니다. 거의 모든 고급 언어는 정규식을 지원하거나 호출을 위해 미리 만들어진 코드 라이브러리를 제공합니다. 이 기사에서는 ASP 환경의 일반적인 처리 작업을 예로 들어 정규식의 응용 기술을 소개합니다.
1. 비밀번호와 이메일 주소의 형식을 확인하세요.
첫 번째 예에서는 정규식의 기본 기능을 보여줍니다. 즉, 임의로 복잡한 문자열을 추상적으로 설명합니다. 이것이 의미하는 바는 정규식이 프로그래머에게 적은 양의 코드만으로 애플리케이션에서 발견되는 모든 문자열 패턴을 설명할 수 있는 공식적인 문자열 설명 방법을 제공한다는 것입니다. 예를 들어 기술 관련 업무에 종사하지 않는 사람의 경우 비밀번호 형식에 대한 요구 사항은 다음과 같이 설명할 수 있습니다. 비밀번호의 첫 번째 문자는 문자여야 하며, 비밀번호는 4자 이상 15자 이하여야 합니다. 비밀번호에는 문자, 숫자, 밑줄 이외의 문자를 포함할 수 없습니다.
프로그래머로서 우리는 위의 암호 형식에 대한 자연어 설명을 ASP 페이지가 이해할 수 있도록 다른 형식으로 변환하고 적용하여 불법적인 암호 입력을 방지해야 합니다. 이 비밀번호 형식을 설명하는 정규식은 ^[a-zA-Z]w{3,14}$입니다.
ASP 애플리케이션에서는 아래와 같이 비밀번호 확인 프로세스를 재사용 가능한 함수로 작성할 수 있습니다
.
희미한 re
re = new RegExp
re.IgnoreCase = false로
설정
re.global = 거짓
re.Pattern = "^[a-zA-Z]w{3,14}$"
TestPassword = re.Test(strPassword)
종료 기능
아래에서는 비밀번호 형식을 확인하기 위한 정규식을 자연어 설명과 비교합니다.
비밀번호의 첫 번째 문자는 문자여야 합니다. 정규식 설명은 "^[a-zA-Z]"입니다. 여기서 " ^" 문자열의 시작을 나타내며 하이픈은 RegExp가 지정된 범위의 모든 문자와 일치하도록 지시합니다.
비밀번호는 4자 이상 15자 이하여야 합니다. 정규식 설명은 "{3,14}"입니다.
비밀번호에는 문자, 숫자, 밑줄 이외의 문자를 포함할 수 없습니다. 정규식 설명은 "w"입니다.
몇 가지 참고 사항: {3, 14}는 이전 패턴이 3자 이상 14자 이하와 일치함을 의미합니다(첫 번째 문자를 추가하면 4~15자가 됨). 중괄호 안의 구문은 매우 엄격하며 쉼표 양쪽에 공백을 허용하지 않습니다. 공백을 추가하면 정규식의 의미에 영향을 미치고 비밀번호 형식 확인 중에 오류가 발생합니다. 또한 위 정규식 끝에 "$" 문자가 추가되지 않습니다. $ 문자를 사용하면 정규 표현식이 문자열과 끝까지 일치하게 되므로 뒤에 추가 문자가 없어도 유효한 비밀번호가 보장됩니다.
비밀번호 형식 확인과 유사하게 이메일 주소의 적법성을 확인하는 것도 매우 일반적인 문제입니다. 정규식을 사용하여 간단한 이메일 주소 확인을 수행하는 것은 다음과 같이 구현할 수 있습니다
.
희미한 re
re = new RegExp
re.pattern = "^w+@[a-zA-Z_]+?.[a-zA-Z]{2,3}$"로 설정
Response.Write re.Test(" [email protected] ")
%>
2. HTML 페이지의 특정 부분 추출
HTML 페이지에서 콘텐츠를 추출할 때 직면하는 주요 문제는 원하는 콘텐츠 부분을 정확하게 식별할 수 있는 방법을 찾아야 한다는 것입니다. 예를 들어, 다음은 뉴스 헤드라인을 표시하는 HTML 코드 조각입니다.
<table border="0" width="11%" class="Somestory">
<tr>
<td 너비="100%">
<p align="center">기타 콘텐츠...</td>
</tr>
</테이블>
<테이블 테두리="0" 너비="11%" 클래스="제목">
<tr>
<td 너비="100%">
<p align="center">이라크 전쟁! </td>
</tr>
</테이블>
<table border="0" width="11%" class="Someotherstory">
<tr>
<td 너비="100%">
<p align="center">기타 콘텐츠...</td>
</tr>
</table>
위의 코드를 보면 뉴스 제목이 중앙 테이블로 표시되고 클래스 속성이 Headline으로 설정되어 있음을 쉽게 알 수 있습니다. HTML 페이지가 매우 복잡한 경우에는 Microsoft IE 5.0부터 제공되는 추가 기능을 사용하여 페이지에서 선택한 부분의 HTML 코드만 볼 수 있습니다. http://www.microsoft.com/Windows/ie를 방문하세요. /WebAccess/default.ASP 자세히 알아보기 이 예에서는 이 테이블이 클래스 속성이 Headline으로 설정된 유일한 테이블이라고 가정합니다. 이제 정규식을 생성하고 정규식을 통해 이 헤드라인 테이블을 찾아 이 테이블을 우리 페이지에 포함해야 합니다. 첫 번째는 정규식을 지원하는 코드를 작성하는 것입니다:
<%
희미하게, strHTML
Set re = new RegExp ' 정규식 객체 생성
re.IgnoreCase = true
re.Global = false '첫 번째 일치 후 검색 종료
%>
이제 추출하려는 영역을 고려하십시오. 여기서 추출하려는 영역은 닫는 태그와 뉴스 제목의 텍스트를 포함한 전체 <table> 구조입니다. 따라서 검색의 시작 문자는 <table> 시작 태그여야 합니다: re.Pattern = "<table.*(?=Headline)". 이 정규 표현식은 테이블의 시작 태그와 일치하며 시작 태그와 "제목" 사이의 모든 항목(줄 바꿈 제외)을 반환할 수 있습니다. 일치하는 HTML 코드를 반환하는 방법은 다음과 같습니다.
'일치하는 모든 HTML 코드를 Matches 컬렉션에 넣습니다.
Set Matches = re.Execute(strHTML)
'일치하는 모든 HTML 코드 표시
일치하는 각 항목에 대해
응답.쓰기 항목.값
다음
'다음 중 하나를 표시합니다.
Response.write Matches.Item(0).Value는
이 코드를 실행하여 이전에 표시된 HTML 조각을 처리합니다. 정규식은 다음과 같이 일치 항목의 내용을 반환합니다. 정규식 표현식의 "(?=Headline)"은 문자를 가져오지 않으므로 테이블 클래스 속성의 값을 볼 수 없습니다. 테이블의 나머지 부분을 가져오는 코드도 매우 간단합니다. re.Pattern = "<table.*(?=Headline) (.|n)*?</table>". 그 중: "(.|n)" 뒤의 "*"는 0 이상의 문자와 일치합니다. ”는 "*" 일치 범위를 최소화합니다. 즉, 표현식의 다음 부분을 찾기 전에 가능한 한 적은 수의 문자를 일치시킵니다. </table>은 테이블의 끝 태그이므로
이를 방지하는 것이 매우 중요합니다
.예를 들어 위에 제공된 HTML 코드 조각의 경우 이 "?"를 삭제하면 반환되는 내용은 다음과 같습니다.
<table border="0" width="11%" class=" 제목">
<tr>
<td 너비="100%">
<p align="center">이라크 전쟁! </td>
</tr>
</테이블>
<table border="0" width="11%" class="Someotherstory">
<tr>
<td 너비="100%">
<p align="center">기타 콘텐츠...</td>
</tr>
</테이블>
반환된 콘텐츠에는 Headline 테이블의 <table> 태그뿐만 아니라 Someotherstory 테이블도 포함되어 있음을 알 수 있습니다.
이 예는 상당히 이상적인 전제를 가정합니다. 실제 응용 프로그램에서는 상황이 훨씬 더 복잡합니다. 특히 사용 중인 소스 HTML 코드 작성에 영향을 주지 않는 경우 ASP 코드 작성은 특히 어렵습니다. 가장 효과적인 방법은 추출할 콘텐츠 근처의 HTML을 분석하는 데 더 많은 시간을 투자하고 자주 테스트하여 추출된 콘텐츠가 정확히 필요한 것인지 확인하는 것입니다. 또한 정규식이 소스 HTML 페이지의 어떤 콘텐츠와도 일치할 수 없는 상황에 주의하고 처리해야 합니다. 콘텐츠는 매우 빠르게 변경될 수 있으므로 다른 사람이 콘텐츠 형식을 변경했다는 이유로 페이지에 터무니없는 오류가 발생하지 않도록 하세요.
3. 텍스트 데이터 파일 구문 분석
데이터 파일의 형식과 유형은 다양합니다. XML 문서, 구조화된 텍스트, 구조화되지 않은 텍스트도 ASP 응용 프로그램의 데이터 소스가 되는 경우가 많습니다. 아래에서 살펴볼 예는 한정자를 사용하는 구조화된 텍스트 파일입니다. 한정자(예: 따옴표)는 문자열에 레코드를 필드로 구분하는 구분 기호가 포함된 경우에도 문자열 부분을 분리할 수 없음을 나타냅니다.
다음은 간단한 구조의 텍스트 파일입니다:
성, 이름, 전화번호, 설명 Sun, Wukong, 312 555 5656, ASP는 매우 좋습니다. Pig, Bajie, 847 555 5656, 저는 영화 제작자입니다
. 간단합니다. 첫 번째 줄은 제목이고 다음 두 줄은 쉼표로 구분된 기록입니다. 이 파일을 구문 분석하는 것도 매우 간단합니다. 파일을 줄 바꿈 기호에 따라 줄로 분할한 다음 각 레코드를 필드에 따라 분할하면 됩니다.
그러나성, 이름, 전화번호, 설명 Sun, Wukong, 312 555 5656 등
특정 필드 내용에 쉼표를 추가하면
ASP, VB 및 SQL이 좋습니다.
Pig, Bajie, 847 555 5656, 저는 영화 제작자입니다.
쉼표 구분 기호만 인식하는 파서의 관점에서는 마지막 필드에 두 필드의 내용이 포함되어 있기 때문에 첫 번째 레코드를 구문 분석할 때 문제가 발생합니다. 이러한 유형의 문제를 방지하려면 구분 기호가 포함된 필드를 한정자로 묶어야 합니다. 작은따옴표는 일반적으로 사용되는 한정자입니다. 위 텍스트 파일에 작은따옴표 한정자를 추가하면 그 내용은 다음과 같습니다:
성, 이름, 전화번호, 설명 Sun, Wukong, 312 555 5656, 'I like ASP, VB and SQL'
Zhu, Bajie, 847 555 5656, '나는 영화 제작자입니다'
이제 어떤 쉼표가 구분 기호이고 어떤 쉼표가 필드 내용인지 결정할 수 있습니다. 즉, 인용 부호 안에 나타나는 쉼표만 내용으로 간주하면 됩니다. 분야의. 다음으로 해야 할 일은 쉼표를 기준으로 필드를 분할할 시기와 쉼표를 필드 내용으로 처리할 시기를 결정하는 정규식 구문 분석기를 구현하는 것입니다.
여기서 문제는 대부분의 정규 표현식이 직면하는 문제와 약간 다릅니다. 일반적으로 우리는 정규식과 일치하는지 확인하기 위해 텍스트의 작은 부분을 살펴봅니다. 하지만 여기서는 전체 텍스트 줄을 고려한 후에만 따옴표 안에 무엇이 있는지 확실하게 알 수 있습니다.
다음은 문제를 설명하는 예입니다. 텍스트 파일에서 내용 반 줄을 무작위로 추출하여 1, beach, black, 21, ', dog, cat, duck, ', . 이 예에서는 "1" 왼쪽에 다른 데이터가 있기 때문에 해당 내용을 구문 분석하기가 매우 어렵습니다. 이 데이터 조각 앞에 작은따옴표가 몇 개나 있는지 모르므로 따옴표 안에 어떤 문자가 있는지 확인할 수 없습니다(따옴표 안의 텍스트는 구문 분석 중에 분할할 수 없습니다). 데이터 조각 앞에 짝수(또는 없음) 작은따옴표가 있으면 "', dog, cat, duck, '"는 따옴표 붙은 문자열이며 분할할 수 없습니다. 앞의 따옴표의 개수가 홀수이면 "1, beach, black, 21, '"는 문자열의 끝이며 분할할 수 없습니다.
따라서 정규식은 문자가 따옴표 쌍 내부에 있는지 외부에 있는지를 결정하기 위해 나타나는 따옴표 수를 고려하여 전체 텍스트 줄을 분석해야 합니다. 즉,(,(?=([^']*'[ ^']*') *(?![^']*')). 이 정규식은 먼저 따옴표를 찾은 다음 계속 검색하여 쉼표 뒤의 작은따옴표 수가 짝수이거나 0인지 확인합니다. 이 정규식은 다음 판단을 기반으로 합니다. 쉼표 뒤의 작은따옴표 수가 짝수이면 쉼표가 문자열 외부에 있는 것입니다. 다음 표에는 더 자세한 지침이 나와 있습니다.
, 쉼표 찾기
(?= 이 패턴과 일치하도록 앞으로 계속 검색합니다.
(새 패턴을 시작
[^']*' [따옴표가 아닌 문자] 0 이상, 뒤에 따옴표가 옴
[^']*'[^']*) [따옴표가 아닌 문자] 0 이상, 뒤에 따옴표가 옵니다. 이전 콘텐츠와 결합하면 인용 쌍과 일치합니다.
)*는 패턴을 종료하고 전체 패턴(따옴표 쌍)과 0회 이상 일치합니다.
(?! 앞으로 검색해서 이 패턴은 제외하세요
[^']*' [따옴표가 아닌 문자] 0 이상, 뒤에 따옴표가 옴
) 끝 모드 아래에는
문자열 매개 변수를 받아들이고 문자열의 쉼표 구분 기호와 작은따옴표 한정자에 따라 문자열을 분할하고 결과 배열을 반환하는 VBScript 함수가 있습니다.
Function SplitAdv(strInput)
희미한 물체 RE
Set objRE = new RegExp
'RegExp 객체 설정
objRE.IgnoreCase = true
objRE.Global = 참
objRE.Pattern = ",(?=([^']*'[^']*')*(?![^']*'))"
' 바꾸기 메서드는 chr(8)을 사용하여 원하는 것을 바꿉니다. 쉼표를 사용하려면 chr(8)은b입니다.
' 문자, b는 문자열에 극히 드물게 나타날 수 있습니다.
' 그런 다음 b에 따라 문자열을 분할하고 배열에 저장합니다.
SplitAdv = 분할(objRE.Replace(strInput, "b"), "b")
End Function
즉, 정규식을 사용하여 텍스트 데이터 파일을 구문 분석하면 효율성이 높고 복잡한 조건을 기반으로 파일을 분석하고 유용한 데이터를 추출하는 데 많은 시간을 절약할 수 있다는 장점이 있습니다. 여전히 많은 기존 데이터를 사용할 수 있는 빠르게 발전하는 환경에서는 효율적인 데이터 분석 루틴을 구성하는 방법을 아는 것이 귀중한 기술이 될 것입니다.
4. 문자열 대체
마지막 예에서는 VBScript 정규식의 대체 기능을 살펴보겠습니다. ASP는 다양한 데이터 소스에서 얻은 텍스트의 형식을 동적으로 지정하는 데 자주 사용됩니다. ASP는 VBScript 정규식의 강력한 기능을 활용하여 일치하는 복잡한 텍스트를 동적으로 변경할 수 있습니다. HTML 태그를 추가하여 일부 단어를 강조하는 것은 검색 결과에서 검색 키워드를 강조하는 것과 같은 일반적인 응용 프로그램입니다.
이 작업이 수행되는 방법을 설명하기 위해 문자열에서 모든 ".NET"을 강조 표시하는 예를 살펴보겠습니다. 이 문자열은 데이터베이스나 기타 웹 사이트 등 어디에서나 얻을 수 있습니다.
<%
regEx = 새 RegExp 설정
regEx.Global = 참
regEx.IgnoreCase = True
'정규식 패턴,
'".NET"으로 끝나는 단어나 URL을 찾으세요.
regEx.Pattern = "(b[a-zA-Z._]+?.NETb)"
' 대체 기능을 테스트하는 데 사용되는 문자열
strText = "Microsoft는 www.ASP.NET이라는 새로운 웹사이트를 만들었습니다.
'정규식의 바꾸기 메서드를 호출하세요.'
'$1은 일치하는 텍스트를 현재 위치에 삽입한다는 의미입니다.
응답.쓰기 regEx.Replace(strText, _
"<b 스타일='색상: #000099; 글꼴 크기: 18pt'>$1</b>")
%>
이 예에서는 주목해야 할 몇 가지 중요한 사항이 있습니다. 전체 정규식은 한 쌍의 괄호 안에 들어가며, 그 기능은 나중에 사용하기 위해 일치하는 모든 내용을 가로채는 것입니다. 이 내용은 대체 텍스트에서 $1로 참조됩니다. 대체당 최대 9개의 유사한 차단을 사용할 수 있으며 각각 $1에서 $9까지 참조됩니다. 정규식의 바꾸기 메서드는 VBScript 자체의 바꾸기 함수와 다릅니다. 이 메서드에는 검색할 텍스트와 바꿀 텍스트라는 두 가지 매개 변수만 필요합니다.
이 예에서는 검색된 ".NET" 문자열을 강조 표시하기 위해 굵은 태그와 기타 스타일 속성으로 묶었습니다. 이러한 검색 및 교체 기술을 사용하면 웹사이트 검색 프로그램에 검색 키워드를 강조 표시하는 기능을 쉽게 추가하거나 페이지에 나타나는 키워드에 대해 다른 페이지로의 링크를 자동으로 추가할 수 있습니다.
결론
이 기사에서 소개된 몇 가지 정규식 기술이 정규식을 적용하는 시기와 방법에 영감을 주었기를 바랍니다. 이 문서의 예제는 VBScript로 작성되었지만 정규식은 ASP.NET에서도 유용합니다. 정규식은 서버측 컨트롤 양식 유효성 검사를 위한 주요 메커니즘 중 하나이며 시스템을 통해 전체 .Text.RegularExpressions 네임스페이스로 내보내집니다. .Text.RegularExpressions 네임스페이스.