하하, 몇 마디로 시작해 보겠습니다. 작년에 저는 C#을 사용하여 구문 강조 도구를 만들었습니다. 이 도구는 구성 파일의 정보를 기반으로 주어진 코드를 HTML로 포맷하여 웹 페이지에 동일한 구문을 표시할 수 있도록 했습니다. 편집기에서 요소 강조 효과 및 코드 접기를 지원합니다. 그렇군요, 블로그에서 본 것과 비슷하네요. 당시 MSN Space를 사용하고 있었기 때문에 이 기능을 제공하지 않아서 제가 직접 작성해야 했습니다.
저는 C#을 사용하여 작성했습니다. 처음에는 키워드 등을 판단하기 위해 for, while, switch, if 등과 같은 매우 번거로운 기본 문을 사용했습니다. 당시에는 정규 표현식이 있었기 때문에 이 조잡한 방법만 사용할 수 있지만, 여전히 이 방법은 함수에 있어서 긴 코드일 뿐이고 앞으로도 유지하기가 매우 어려울 것이라고 생각했습니다. 다른 소프트웨어는 이렇게 작성할 수 없기 때문에... 구글에서 잠시 검색한 끝에 구문 강조 기능이 있는 코드와 오픈 소스 프로젝트를 찾아서 살펴보기 시작했습니다. . . . . 와, 모든게 너무 복잡하네요. 솔직히 남의 코드 보는 걸 제일 싫어하는 편인데, 남의 코드를 보는 게 정말 헷갈리네요. 매우 상세한 문서 설명이 없으면 처음에는 보고 싶지 않을 것입니다. 기껏해야 다른 사람들이 인터페이스를 어떻게 작성하는지 살펴본 다음 내부적으로 어떻게 구현되는지 추측할 뿐입니다.
검색이 그다지 도움이 되지는 않았지만 여전히 정규 표현식을 어디서 봤는지 잊어버렸습니다. 그때부터 "깨진 것"을 개선하면서 정규식 공부를 시작했습니다. 얼마 지나지 않아 저는 Blog Park에서 다시 블로그 활동을 시작했고 마침내 Blog Park의 구문 강조 기능을 활성화했습니다. 그래서 HTML을 강조하는 코드를 직접 작성하려는 큰 동기를 잃었습니다. 둘째, C#으로 만든 구문 강조 모듈은 서버 측이나 WinForm 프로그램에서만 실행될 수 있으며, 궁극적으로 얻고 싶은 것은 페이지에 표시할 HTML 코드가 이 작업에 가장 적합하다고 생각합니다. 제가 JS에 대해 잘 모르는 것이 아쉽습니다. . . 나중에 나는 이 기간 동안 다른 일을 하기 시작했고 구문 강조 모듈을 개선하지 않았습니다.
어젯밤에 야근을 하고 집에 왔는데 원래는 계속해서 UML을 배워서 패턴을 보려고 했는데, 회사에 데이터베이스에서 반환된 결과에서 모든 HTML 태그를 제거해야 하는 모듈이 있다는 것이 생각나서 정규 프로그램을 열었습니다. 표현 도구 RegexBuddy. 그러다가 RegexBuddy의 도움말 문서에서 JScript에서 정규식을 사용하는 방법에 대한 간단한 튜토리얼을 보고 다시 호기심이 생겨서 UltraEdit-32를 열고 간단한 JavaScript를 작성하여 실험해 보기 시작했습니다.
많은 곳에서 반복적인 테스트와 많은 우회가 필요하기 때문에 여기에서는 테스트 과정을 자세히 다루지 않겠습니다. 여기서는 테스트에서 요약한 JScript의 정규식 사용법을 직접 설명하겠습니다.
헛소리는 그만하고 본론으로 들어가자!
총리가 JScript의 정규식 개체 RegExp에 대해 이야기합니다.
JScript에서 정규식 작업을 제공하는 클래스 이름은 RegExp이며 RegExp 유형의 개체는 두 가지 방법으로 인스턴스화될 수 있습니다.
방법 1, 생성자 인스턴스화:
var myRegex = new RegExp(" \w +", "igm ");
//w+는 실제 정규 표현식입니다. 첫 번째 는 이스케이프를 위한 것입니다. igm은 각각 대소문자 무시, 전역 검색 및 여러 줄 검색을 의미합니다.
방법 2, 직접 할당 방법:
var myRegex = /w+/igm;
//여기서 전송 문자를 사용할 필요가 없다는 점을 제외하면 효과는 이전 명령문과 동일합니다. 원래 정규 표현식은 이전 예의 igm과 동일한 효과를 갖습니다.
사용되는 구체적인 방법은 모든 사람의 선호도에 따라 다릅니다. 개인적으로 RegexBuddy 도움말 문서에서는 두 번째 방법을 권장합니다. RegExp 개체에는 다음 작업이 포함됩니다.
exec(string str): 정규식 일치를 수행하고 MSDN에서 제공된 예제 실행 결과에 따르면 각 exec 실행은 마지막 직접 일치의 끝에서 시작됩니다. 반환된 값은 RerExp 개체인 것으로 보이며 RegexBuddy에서 제공하는 설명은 배열을 반환한다는 것이지만 자세한 예제는 제공되지 않습니다. 실험 결과에 따르면 더 신뢰할 수 있다고 생각합니다.
compile(string regex, string flags): 정규식을 미리 컴파일하여 더 빠르게 실행되도록 하면 사전 컴파일 후 효율성이 크게 향상됩니다. regex 매개변수는 정규식이며 플래그는 다음 세 가지 값의 조합일 수 있습니다: g – 전역 검색 내 테스트 결과는 g 플래그를 추가하지 않으면 첫 번째 정규화된 문자열 i – 대소문자 m을 무시하고 일치할 수 있다는 것입니다. – 여러 줄 검색은 기본적으로 여러 줄 검색인 것 같습니다.
test(string str): str이 정규 표현식과 일치하면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 문자열 개체
RegExp 개체와 유사한 이 일치 메서드에는 다음 속성이 포함됩니다
.:
index: 문자열에서 첫 번째로 일치하는 표현식의 위치, 처음에는 -1
입력: 정규식의 일치 대상, 읽기 전용이라는 점에 유의하세요.
lastIndex: 다음 일치 표현식의 위치입니다. 원래 단어는 (검색된 문자열에서 다음 일치가 시작되는 문자 위치를 반환합니다.) 이 속성을 사용하지 않았는지 모르겠습니다.
lastMatch: 표현식과 일치하는 마지막 문자열
lastParen: 마지막으로 일치하는 부분 일치 문자열입니다. 예를 들어 정규식에서 ()로 그룹화된 일치 항목이 여러 개인 경우 lastParen은 일치된 결과의 마지막 그룹을 나타냅니다.
leftContext: 대상 문자열의 시작 부분부터 마지막 일치 항목의 시작 위치까지의 모든 문자입니다.
rightContext: 마지막 일치 항목의 끝부터 전체 대상 문자열의 끝까지의 모든 문자입니다.
$1...$9: n번째 일치 그룹의 결과를 나타냅니다. 이는 정규식에 여러 개의 () 그룹이 있을 때 유용합니다.
다음
으로 JScript의 String 개체 및 정규식과 관련된 작업에 대해 이야기하겠습니다.
(문자열 정규식): 정규식을 허용하고 문자열이 표현식과 일치하는지 여부를 반환합니다.
바꾸기(srting regex, string str): 정규식과 일치하는 하위 문자열을 str로 바꿉니다. 이 함수는 간단해 보이지만 더 고급 사용법을 숨깁니다.
예 1:
var str1 = "A:제 이름은 Peter입니다!nB:안녕 Peter!";
str1 = str1.replace(/피터/g,"잭");
경고(str1);
이 예제는 문자열을 바꾸는 것만큼 간단합니다. 물론 이 표현식의 기능은 이에 국한되지 않습니다. 이 표현식을 사용하는 데 능숙하다면 이전에 많은 코드가 필요했던 많은 작업을 완료하는 데에도 사용할 수 있습니다. 예를 들어, 코드 키워드 앞뒤에 강조 표시된 HTML 태그를 추가하세요. 이전 예에서 바꾸기는 일치하는 텍스트를 새 텍스트로만 바꿀 수 있는 것으로 보입니다. 키워드 앞뒤에 태그를 삽입하려면 어떻게 해야 합니까? 다시 생각해보면, 교체할 때 일치하는 결과를 사용할 수 있다면 작업이 더 쉬울 것입니다. 키워드를 태그 헤더 + 키워드 + 태그 꼬리로 바꾸면 됩니다.
하지만 정규식 일치 결과를 대체에 어떻게 사용합니까?
이때 "매칭 변수"를 사용해야 합니다. 매칭 변수는 정규 매칭 결과를 나타내는 데 사용됩니다. 매칭 변수에 대한 설명은 다음과 같습니다.
$& -- 일치하는 모든 그룹의 일치 결과를 나타냅니다. 마지막으로 일치하는 그룹은 정규식의 () 그룹입니다.
$$ -- $ 문자를 나타냅니다. 일치하는 변수는 $ 문자를 사용하므로 이스케이프해야 합니다.
$n -- 이전 $1...$9와 유사하며 일치하는 결과의 n번째 집합을 나타냅니다.
$nn - 매우 간단하게 nn번째 일치 그룹의 결과입니다.
$` - 앞서 언급한 leftContext입니다. 예를 들어 abcdefg가 d와 일치하면 abc는 leftContext입니다.
$' -- 위와 매우 유사합니다. 잘못 읽지 마세요! , 이것은 rightContext입니다. 비유하자면 efg는 위 예의 rightContext입니다. 따라서 이제 키워드 앞뒤에 태그를 삽입하는 것이 매우 간단합니다.
var str1 = "A:My name is Peter!nB:Hi 피터!" ;
str1 = str1.replace(/Peter/g, "<b>$&</b>");
경고(str1);
벌써 0시 39분이에요. . . 여기서 멈추자.
일반 도구 소프트웨어 다운로드(비밀번호: regex): regex buddy 2.06.zip
제가 작성한 예를 참조하십시오: JScript 구문 강조(코드 합리화)
다음은 MSDN의 몇 가지 예입니다.
function matchDemo()
{
변종;
var re = new RegExp("d(b+)(d)","ig");
var str = "cdbBdbsbdbdz";
var arr = re.exec(str);
s = "$1에는 다음이 포함됩니다: " + RegExp.$1 + "n";
s += "$2에는 다음이 포함됩니다: " + RegExp.$2 + "n";
s += "$3에는 다음이 포함됩니다: " + RegExp.$3;
보고);
}
함수 RegExpTest()
{
var ver = Number(ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion())
if (ver >= 5.5){
var src = "스페인의 비는 주로 평야에 내립니다.";
var re = /w+/g;
var arr;
while ((arr = re.exec(src)) != null)
print(arr.index + "-" + arr.lastIndex + "t" + arr);
}
또 다른{
Alert("이 작업을 수행하려면 최신 버전의 JScript가 필요합니다.");
}
}
함수 matchDemo()
{
var s; //변수를 선언합니다.
var re = new RegExp("d(b+)(d)","ig"); //정규 표현식 패턴.
var str = "cdbBdbsbdbdz"; //검색할 문자열입니다.
var arr = re.exec(str); //검색을 수행합니다.
s = "$1은 다음을 반환합니다: " + RegExp.$1 + "n";
s += "$2는 다음을 반환합니다: " + RegExp.$2 + "n";
s += "$3은 다음을 반환합니다: " + RegExp.$3 + "n";
s += "입력 반환: " + RegExp.input + "n";
s += "lastMatch는 다음을 반환합니다: " + RegExp.lastMatch + "n";
s += "leftContext는 다음을 반환합니다: " + RegExp.leftContext + "n";
s += "rightContext는 다음을 반환합니다: " + RegExp.rightContext + "n";
s += "lastParen은 다음을 반환합니다: " + RegExp.lastParen + "n";
return(s); //결과를 반환합니다.
}
document.write(matchDemo());
지나가는 영웅들이 이 기사에 대한 의견이 있으면 여기에 게시해 주세요. 함께 배우고 발전해 나가세요.