source

JavaScript에서 문자열 매칭을 위한 스위치 문

gigabyte 2022. 12. 8. 21:20
반응형

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;
}

하나의 은 ' 낫다'를 하는 것입니다.inputregexp 일치 결과 필드:

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

반응형