A pattern cut with a laserA pattern cut with a laserA pattern cut with a laser레이저로 자른 패턴
JMP의 패턴 일치 기능으로 할 수 있습니다. 거의 regex가 할 수있는 모든것과 조금만 더 . 내부적으로 regex는 패턴 일치 함수로 만들어지며 사용하기 쉬운 인터페이스를 제공합니다. 아마 당신은 조금만 더 따라서 정규 표현식에 대한 경험이 있다면 잘 지낼 수 있습니다. 또는 패턴 일치 언어가 더 매력적일 수도 있습니다. 이러한 정규 표현식은 상당히 불투명 할 수 있습니다.
가장 간단한 패턴 일치는 다음과 같습니다.
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs" ); // ok will be 1 because the pattern "eggs" is found
1
계란을 베이컨으로 바꾼다 :
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs", "bacon" ); // 3rd argument is the replacement text
print(source);
"the old fox had bacon for breakfast"
그리고 여우가 먹는 것을 알아내는 것 :
morningMeal = .;
source = "the old fox had yogurt for breakfast";
foods = "eggs" | "bacon" | "yogurt" | "honey";
ok = patMatch( source, foods >? morningMeal ); // >? is an assign-to-the-right operator for patterns
print(morningMeal );
"yogurt"
이전에 패턴을 보지 못했다면 이상하게 보이는 과제에 대해 의문을 품을 수도 있습니다. 음식 . 이 단일 수직 막대는 "또는"을 의미합니다. 문자열을 연결하기위한 두 개의 세로 막대는 아닙니다. 음식 이 네 단어 중 하나와 일치하는 패턴 값입니다. 패턴을 연결하는 + 연산자도 있습니다 (문자열 연결과 같지 않음). 이 예제를 강화 해 보겠습니다.
source = "the old fox had yogurt for breakfast, honey for dinner, and bacon for lunch, but eggs at bedtime.";
foods = "eggs" | "bacon" | "yogurt" | "honey";
morningMeal=.;
middayMeal=.;
eveningMeal=.;
ok1 = patMatch( source, ( foods >? morningMeal + " for breakfast" ) );
ok2 = patMatch( source, ( foods >? middayMeal + " for lunch" ) );
ok3 = patMatch( source, ( foods >? eveningMeal + " for dinner" ) );
show(morningMeal, middayMeal, eveningMeal);
morningMeal = "yogurt";
middayMeal = "bacon";
eveningMeal = "honey";
음식을 찾기 위해 3 개의 서로 다른 매치 (패턴을 연결하기 위해 + 기호 사용). 보다 복잡한 패턴을 쉽게 만들 수 있습니다.
먼저 숫자의 범위와 일치하는 작은 패턴
digits = patSpan("0123456789");
그런 다음 패턴을 사용하여 숫자를 일치시키는 패턴 -314.15E-2 . ""대안을 사용하면 부호, 십진수, 분수 및 지수가 선택 사항이므로 일치하는 항목을 허용하지 않습니다.
number = ( "" | "-" ) // optional sign
+ ( digits + ( "." + ( ( digits ) | "" ) | "" ) ) // leading digit not optional
+ ( ( ("E"|"e") + ( "" | "-" ) + digits ) | "" ) ; // another optional sign in the optional exponent
이것은 아니 패턴; 따옴표는 추악합니다 (이스케이프가 필요합니다). 그래서 변수를 만듭니다.
quote = "\!""; // nightmare -> thing of beauty
다음은 따옴표로 묶인 텍스트를 일치시키는 패턴입니다. ~ 안에 소스 파일 텍스트 (아래)는 내장 된 따옴표를 두 개의 따옴표로 나타냅니다. 따라서이 패턴은 따옴표 쌍이 함께 유지되도록하기 위해 조금 더 세게 작동합니다. patRepeat () 가능한 한 여러 차례 논증을 반복 할 것입니다. patBreak () 그것의 주장을 포함하지 않고 일치 할 것입니다. patLen () ""표시 대신에 사용됩니다. 요청한 문자 수와 일치합니다. 따라서 리터럴은 따옴표로 시작하고 끝나며 그 사이에는 따옴표까지 문자가 실행됩니다. patBreak는 따옴표를 포함하지 않는다는 것을 기억하십시오. 그래서 두 개의 따옴표가 있고 더 많이 반복하거나, 반복을 멈추고 마지막 따옴표를 찾으십시오.
literal = quote + patRepeat( patBreak(quote) + ( ( quote + quote ) | patLen(0) ) ) + quote;
이 작은 패턴은 다른 운영 체제에서 사용되는 다양한 행 끝 문자와 일치합니다.
newline = "\!r\!n" | "\!r" | "\!n" | "\!N";
샘플 입력의 필드는 쉼표 또는 파일의 시작 부분, 파일의 끝 부분 또는 개행 문자로 구분됩니다. patPos () 과 patRPos () 현재 위치가 인수와 일치하는 경우 길이가 0 인 문자열을 찾습니다. patRPos (0) 문자열의 오른쪽 끝입니다. patPos (0) 문자열의 시작 부분입니다.
endOfField = "," | newline | patPos(0) | patRPos(0);
일치하는 샘플 텍스트가 있는데, 따옴표가 더 이상 이스케이프 할 필요가 없도록 특수 대괄호 이스케이프를 사용합니다.
sourcefile = "\[
-123.456e-78,"I said,""how are you?""",11,555-5555,"fine, thank you",3.1459,1.414
]\";
마침내! while 루프를 사용하여 패턴을 찾아 쉼표로 바꾸어 매번 발견 된 텍스트를 인쇄합니다. 마지막에는 일치하지 않는 텍스트를 표시하십시오.
while(patMatch(sourcefile, endOfField + (number | literal ) >? found + endOfField , ","),
write(found || "\!n") // display the found text and a newline
);
write( "Non matches: ", sourceFile, "\!n");
-123.456e-78
"I said,""how are you?"""
11
"fine, thank you"
3.1459
1.414
Non matches: ,555-5555,
>? 연산자는 패턴 내의 조건부 할당입니다. 할당은 패턴이 성공하고 patMatch ()가 1을 리턴 한 후에 만 이루어집니다. 또한 텍스트가 일치하자마자 즉시 할당되는 >> 연산자가 있습니다 (패턴 일치자가 백업하고 다시 시도해야하는 경우가 많음).
JSL의 패턴 일치는 다음과 같은 다른 흥미로운 기능을 수행 할 수 있습니다. 단일 명령문에서 긴 문자열을 반복 그렇지 않으면 속도가 느려질 수 있습니다. 그만큼 PatRegex () 함수를 사용하면 패턴 일치의 일부로 정규 표현식을 사용할 수 있습니다. 도움말 메뉴의 스크립트 색인에는 패턴 일치 기능 및 설명 목록이 있습니다.
30jan2017 업데이트 : 새 커뮤니티의 서식을 복구하십시오.