JavaScript에서 문자열 매칭을 위한 스위치 문
다음 조건의 스위치는 어떻게 쓰나요?
URL에 "foo"가 포함되어 있는 경우settings.base_url
"bar"입니다.
다음은 필요한 효과를 달성하고 있지만 스위치로 관리하기가 더 쉬울 것 같습니다.
var doc_location = document.location.href;
var url_strip = new RegExp("http:\/\/.*\/");
var base_url = url_strip.exec(doc_location)
var base_url_string = base_url[0];
//BASE URL CASES
// LOCAL
if (base_url_string.indexOf('xxx.local') > -1) {
settings = {
"base_url" : "http://xxx.local/"
};
}
// DEV
if (base_url_string.indexOf('xxx.dev.yyy.com') > -1) {
settings = {
"base_url" : "http://xxx.dev.yyy.com/xxx/"
};
}
풀 스트링 매칭을 하지 않는 한에서는 할 수 없습니다.이것은 서브스트링 매칭을 하는 것입니다.(Sean이 코멘트상에서 지적한 것처럼, 이것은 사실이 아닙니다. 마지막 메모를 참조해 주세요.
맨 위에 있는 regex가 매치에서 비교하고 싶지 않은 모든 항목을 제거하여 만족하는 경우 하위 문자열 일치가 필요하지 않고 다음을 수행할 수 있습니다.
switch (base_url_string) {
case "xxx.local":
// Blah
break;
case "xxx.dev.yyy.com":
// Blah
break;
}
...하지만 다시 말하지만, 그건 당신이 일치하고 있는 완전한 문자열일 때만 작동합니다.만약 그렇다면 실패할 것이다.base_url_string
'yyy'라고 하면 돼xxx.local"과 달리 현재 코드는 "xxx.local" 브랜치 코드와 일치합니다.
업데이트: 좋아요, 기술적으로는switch
서브스트링 매칭에 사용할 수 있지만 대부분의 상황에서는 권장하지 않습니다.(실시간 예)는 다음과 같습니다.
function test(str) {
switch (true) {
case /xyz/.test(str):
display("• Matched 'xyz' test");
break;
case /test/.test(str):
display("• Matched 'test' test");
break;
case /ing/.test(str):
display("• Matched 'ing' test");
break;
default:
display("• Didn't match any test");
break;
}
}
이는 JavaScript 문이 작동하는 방식, 특히 다음 두 가지 주요 측면 때문에 작동합니다.첫 번째, 대소문자가 소스 텍스트 순서로 고려되고 두 번째, 셀렉터가 표현한다(키워드 뒤의 비트).case
)는 케이스가 평가될 때 평가되는 표현입니다(다른 언어에서는 상수가 아닙니다).그래서 저희 테스트 표현은true
, 첫 번째case
결과적으로 생기는 표현true
이용될 수 있습니다.
RegExp는 다음 명령어를 사용하여match
메서드도 있습니다.
에 일치하는지 확인하기 위해case
조항, 우리는 원본을 시험할 것이다.str
값(에 제공됨)switch
스테이트먼트)에 대해서,input
성공자의 특성match
.
input
는 원래 입력 문자열을 포함하는 정규 표현의 정적 속성입니다.
언제match
에러가 반환되다null
예외 오류를 피하기 위해 옵션 체인 연산자(또는 논리 연산자)를 사용합니다.||
레거시 ES의 조건부 연산자)에 액세스하기 전에input
소유물.
const str = 'XYZ test';
switch (str) {
case str.match(/^xyz/)?.input:
console.log("Matched a string that starts with 'xyz'");
break;
case str.match(/test/)?.input:
console.log("Matched the 'test' substring");
break;
default:
console.log("Didn't match");
break;
}
또 하나의 접근법은String()
하나의 요소(캡처 그룹 없음)만 있어야 하며 전체 문자열을 수량자로 캡처해야 하는 결과 어레이를 변환하는 생성자(.*
로 변환합니다을 사용하다했을 경우는, 「」를 해 주세요.null
이 되다'null'
편리하지 것 같습니다.그게 、 편리해편일도 있어요 。
const str = 'XYZ test';
switch (str.toLowerCase()) {
case String(str.match(/^xyz.*/i)):
console.log("Matched a string without case sensitivity");
break;
case String(str.match(/.*tes.*/)):
console.log("Matched a string using a substring 'tes'");
break;
}
좀 더은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,test
method를 합니다.match
discriptions./^find-this-in/.test(str)
switch (true)
단순히 부울 값을 반환하고 대소문자를 구분하지 않고 일치시키기 쉽습니다.
const str = 'haystack';
switch (true) {
case /^hay.*/i.test(str):
console.log("Matched a string that starts with 'hay'");
break;
}
, 「」를 사용하고 .if
else
else if
수 .
그냥 위치를 사용하세요.호스트 속성
switch (location.host) {
case "xxx.local":
settings = ...
break;
case "xxx.dev.yyy.com":
settings = ...
break;
}
하나의 은 ' 낫다'를 하는 것입니다.input
regexp 일치 결과 필드:
str = 'XYZ test';
switch (str) {
case (str.match(/^xyz/) || {}).input:
console.log("Matched a string that starts with 'xyz'");
break;
case (str.match(/test/) || {}).input:
console.log("Matched the 'test' substring");
break;
default:
console.log("Didn't match");
break;
}
var token = 'spo';
switch(token){
case ( (token.match(/spo/) )? token : undefined ) :
console.log('MATCHED')
break;;
default:
console.log('NO MATCH')
break;;
}
은 원래 합니다. --> 3진 표현은 토큰을 반환합니다.
은 대소문자로 됩니다. ---- > -- -- -- -- -- -- -- 。
이 정의되지 않은 --> 3진법으로 반환됩니다.
되지 않은 것과 합니다.-->되지 않은 것이 .
삼진법은 예를 들어 어떤 것이든 상관없습니다.
( !!~ base_url_string.indexOf('xxx.dev.yyy.com') )? xxx.dev.yyy.com : undefined
===========================================
(token.match(/spo/) )? token : undefined )
삼원적인 표현입니다.
이 경우 테스트는 token.match(/spo/)입니다.이 경우 토큰에 보관되어 있는 문자열을 regex 표현 /spo/(이 경우 리터럴 문자열 spo)과 대조합니다.
식과 문자열이 일치하면 true가 되고 토큰(스위치 문이 동작하고 있는 문자열)이 반환됩니다.
token === token이므로 switch 문이 일치하고 대소문자가 평가됩니다.
레이어별로 살펴보면 스위치스테이트먼트에서는 테스트 결과만 표시되도록 스위치스테이트먼트를 'BEPORE'로 평가한다는 것을 이해하면 이해하기 쉬워집니다.
그게 더 쉬울지도 몰라.이렇게 생각해 보세요.
- 우선 일반 문자 사이에 문자열을 끼우다
- 그 후, 「사례」를 찾아냅니다.
:
// 'www.dev.yyy.com'
// 'xxx.foo.pl'
var url = "xxx.foo.pl";
switch (url.match(/\..*.\./)[0]){
case ".dev.yyy." :
console.log("xxx.dev.yyy.com");break;
case ".some.":
console.log("xxx.foo.pl");break;
} //end switch
너무 늦었을 수도 있지만, 저는 과제일 때 이 점이 마음에 들었습니다:)
function extractParameters(args) {
function getCase(arg, key) {
return arg.match(new RegExp(`${key}=(.*)`)) || {};
}
args.forEach((arg) => {
console.log("arg: " + arg);
let match;
switch (arg) {
case (match = getCase(arg, "--user")).input:
case (match = getCase(arg, "-u")).input:
userName = match[1];
break;
case (match = getCase(arg, "--password")).input:
case (match = getCase(arg, "-p")).input:
password = match[1];
break;
case (match = getCase(arg, "--branch")).input:
case (match = getCase(arg, "-b")).input:
branch = match[1];
break;
}
});
};
더 나아가 옵션 목록을 전달하고 |를 사용하여 정규식을 처리할 수 있습니다.
작업 보안을 향상시키는 자체 포함 버전:
switch((s.match(r)||[null])[0])
function identifyCountry(hostname,only_gov=false){
const exceptionRe = /^(?:uk|ac|eu)$/ ; //https://en.wikipedia.org/wiki/Country_code_top-level_domain#ASCII_ccTLDs_not_in_ISO_3166-1
const h = hostname.split('.');
const len = h.length;
const tld = h[len-1];
const sld = len >= 2 ? h[len-2] : null;
if( tld.length == 2 ) {
if( only_gov && sld != 'gov' ) return null;
switch( ( tld.match(exceptionRe) || [null] )[0] ) {
case 'uk':
//Britain owns+uses this one
return 'gb';
case 'ac':
//Ascension Island is part of the British Overseas territory
//"Saint Helena, Ascension and Tristan da Cunha"
return 'sh';
case null:
//2-letter TLD *not* in the exception list;
//it's a valid ccTLD corresponding to its country
return tld;
default:
//2-letter TLD *in* the exception list (e.g.: .eu);
//it's not a valid ccTLD and we don't know the country
return null;
}
} else if( tld == 'gov' ) {
//AMERICAAA
return 'us';
} else {
return null;
}
}
<p>Click the following domains:</p>
<ul onclick="console.log(`${identifyCountry(event.target.textContent)} <= ${event.target.textContent}`);">
<li>example.com</li>
<li>example.co.uk</li>
<li>example.eu</li>
<li>example.ca</li>
<li>example.ac</li>
<li>example.gov</li>
</ul>
하지만 솔직히, 넌 그냥 이런 걸 할 수 있어
function switchableMatch(s,r){
//returns the FIRST match of r on s; otherwise, null
const m = s.match(r);
if(m) return m[0];
else return null;
}
후 ★★★switch(switchableMatch(s,r)){…}
다음과 같이 기본 대소문자를 사용할 수도 있습니다.
switch (name) {
case 't':
return filter.getType();
case 'c':
return (filter.getCategory());
default:
if (name.startsWith('f-')) {
return filter.getFeatures({type: name})
}
}
언급URL : https://stackoverflow.com/questions/2896626/switch-statement-for-string-matching-in-javascript
'source' 카테고리의 다른 글
Galera 클러스터에서 쓰기 속도를 높이는 방법은 무엇입니까?최대 축척을 DB 프록시로 사용 (0) | 2022.12.08 |
---|---|
vs 코드에서 제가 직면한 오류를 해결하는 데 도움을 주실 수 있나요? (0) | 2022.12.08 |
MariaDB 케이스 스테이트먼트 (0) | 2022.12.08 |
HTML5 비디오 다운로드 금지(우클릭 저장) (0) | 2022.11.28 |
VueJ의 드롭다운 메뉴(액티브 메뉴 검색) (0) | 2022.11.28 |