대소 문자를 구분하지 않습니다


413

나는 다음을 가지고있다 :

if (referrer.indexOf("Ral") == -1) { ... }

내가 뭘 좋아하는 것은하는 것입니다 Ral그것이 될 수 있도록하는 것이, 사례를 구분을 RAl, rAl등 여전히 일치합니다.

그 말을 할 수있는 방법이 있나요 Ral대소 문자를 구별되어야한다는?


3
대소 문자를 구분하지 않는 정규 표현식이 더 우아한 솔루션이라고 생각하지만 모든 사람이 RegExp사용자 입력에서 직접 생성하는 함정을 명심해야 합니다. 예를 들어, 사용자가 입력 *할 수 있으며 RegExp생성자 에 오류가 발생합니다 . 허용 된 솔루션에는이 문제가 없습니다.
pllee

답변:


604

.toLowerCase()이후에 추가하십시오 referrer. 이 방법은 문자열을 소문자 문자열로 바꿉니다. 그런 다음, 사용 .indexOf()사용 ral대신에 Ral.

if (referrer.toLowerCase().indexOf("ral") === -1) { 

정규 표현식을 사용하여 동일한 결과를 얻을 수도 있습니다 (동적 패턴을 테스트하려는 경우 특히 유용함).

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp

16
후자의 방법이 더 정확합니다. 전자는 터키어 I 및 기타 문제가있는 대문자 / 소문자 쌍에 실패합니다 : i18nguy.com/unicode/turkish-i18n.html
Domenic

23
터키어의 경우, 사용하는 것이 좋습니다 toLocaleLowerCase()( ref )
Mottie

2
후자는 질문에 대답하지 않으며, 존재하는 경우에만 일치 색인을 얻지 못한다고 말합니다. 질문 제목이 틀리거나 질문입니다.
Maslow

10
@Maslow이 질문의 예는 대소 문자를 구분하지 않는 테스트에 관한 것입니다. 색인을 얻으려면 문자열의.search 방법을 사용하십시오 .var index = referrer.search(/Ral/i);
Rob W

7
동적 정규 표현식 접근 방식의 추가 된 복잡성은 검색 문자열 (예 : "Ral")에 정규 표현식 특수 문자 (예 : $. *? 등등, 당신은 문제가있을 것이므로 특수 문자를 피해야합니다.이 게시물에 대한 Mike Samuel의 답변을 참조하십시오 : endsWith JavaScript
zachelrath

94

다른 옵션은 다음과 같이 검색 방법을 사용하는 것입니다.

if (referrer.search(new RegExp("Ral", "i")) == -1) { ...

전체 문자열을 소문자로 변환하면 더 우아해 보이고 더 효율적일 수 있습니다.
함께 toLowerCase()코드 문자열을 통해 두 개의 패스를 한 번 패스를 소문자로 변환 할 전체 문자열에 다른 원하는 색인을 찾는 것입니다. 코드를
사용 RegExp하면 원하는 인덱스와 일치하는 문자열을 한 번 전달합니다.

따라서 긴 문자열의 경우 RegExp버전 을 사용하는 것이 좋습니다 (짧은 문자열의 경우이 효율성은 RegExp객체 를 생성하는 것으로 인해 발생 합니다)


2
이것은 내 테스트를 기반으로도 꽤 빠릅니다 : jsperf.com/case-insensitive-indexof
일란 스코 비아

6
2018.10.24 기준으로 Chrome에서 toLowerCase가 크게 이깁니다. 와 toLowerCase (95,914,378 - ± 0.89 % - 가장 빠른) (- ± 0.87 % 100 % 느린 269307), 같이 IndexOf 정규식
nixkuroi

21

RegExp을 사용하십시오.

if (!/ral/i.test(referrer)) {
    ...
}

또는 다음을 사용하십시오 .toLowerCase().

if (referrer.toLowerCase().indexOf("ral") == -1)

1
+1, "Turkish I problem"및 기타 함정을 피함으로써 잠재적으로 더 정확할 수 있습니다. i18nguy.com/unicode/turkish-i18n.html
Domenic

15

ES2016부터는 약간 더 좋고, 더 쉽고, 더 우아한 방법을 사용할 수 있습니다 (대소 문자 구분) :

if (referrer.includes("Ral")) { ... }

또는 (대소 문자 구분) :

if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }

https://dev.to/adroitcoder/includes-vs-indexof-in-javascript의 비교는 다음 .indexOf().includes()같습니다.


1
포함은 대소 문자를 구분하지 않는다고 생각합니다.
Kyle

4
@Kyles은 includes이다 대소 문자를 구분 시도 : 크롬 'fooBar'.includes('bar')> ==false
drzaus

10

여기에는 몇 가지 접근 방식이 있습니다.

이 인스턴스에 대해 대소 문자를 구분하지 않고 점검하려면 다음과 같이하십시오.

if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
    ...

또는이 확인을 정기적으로 수행하는 경우에 새로운 indexOf()방법을 추가 할 수 String있지만 대소 문자를 구분하지 않아도됩니다.

String.prototype.indexOfInsensitive = function (s, b) {
    return this.toLowerCase().indexOf(s.toLowerCase(), b);
}

// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...

1
최신 브라우저를 지원하는 defineProperty것이 좋습니다 Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});. 두 업데이트 : 명시 문자열 변환하여 (s+'')루프에서, 비 열거 ( for(var i in '') ... 표시되지 않습니다 indexOfInsensitive.
롭 W

5
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...

@Domenic : 터키 문화와 관련하여 터키는 이러한 측면을 단순화하기 위해 철자법을 고려해야 합니다. 중국은 여러 가지 단순화 개혁 을했으며 터키는 10 % 미만의 중국 인구와 훨씬 간단한 알파벳을 가지고 있습니다. 할 수 있습니다.
Dan Dascalescu


3

모든 언어의 예 :

'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())

2

2016 년이며 어떻게 할 수있는 명확한 방법이 없습니까? 나는 copypasta를 바라고 있었다. 갈 게요

디자인 노트 : 메모리 사용을 최소화하고 속도를 향상 시키려고했기 때문에 문자열의 복사 / 돌연변이가 없습니다. V8 (및 기타 엔진)이이 기능을 최적화 할 수 있다고 가정합니다.

//TODO: Performance testing
String.prototype.naturalIndexOf = function(needle) {
    //TODO: guard conditions here

    var haystack = this; //You can replace `haystack` for `this` below but I wan't to make the algorithm more readable for the answer
    var needleIndex = 0;
    var foundAt = 0;
    for (var haystackIndex = 0; haystackIndex < haystack.length; haystackIndex++) {
        var needleCode = needle.charCodeAt(needleIndex);
        if (needleCode >= 65 && needleCode <= 90) needleCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser
        var haystackCode = haystack.charCodeAt(haystackIndex);
        if (haystackCode >= 65 && haystackCode <= 90) haystackCode += 32; //ToLower. I could have made this a function, but hopefully inline is faster and terser

        //TODO: code to detect unicode characters and fallback to toLowerCase - when > 128?
        //if (needleCode > 128 || haystackCode > 128) return haystack.toLocaleLowerCase().indexOf(needle.toLocaleLowerCase();
        if (haystackCode !== needleCode)
        {
            foundAt = haystackIndex;
            needleIndex = 0; //Start again
        }
        else
            needleIndex++;

        if (needleIndex == needle.length)
            return foundAt;
    }

    return -1;
}

이름에 대한 나의 이유 :

  • 이름에 IndexOf가 있어야합니다
  • 접미사를 추가하지 마십시오.-다음 매개 변수를 나타냅니다.
  • 너무 긴 "caseInsensitive"를 사용하지 마십시오
  • 대소 문자를 구분하는 기본 비교는 처음에는 인간에게 자연스럽지 않기 때문에 "자연"은 좋은 후보입니다.

왜 안 ... :

  • toLowerCase() -동일한 문자열에서 잠재적으로 반복되는 toLowerCase 호출.
  • RegExp-변수로 검색하기 어색합니다. RegExp 객체조차도 문자를 이스케이프 처리하는 것이 어색합니다.

2
2016 년인데도 여전히 세계에서 영어 (또는 다른 ASCII 전용 언어)가 유일한 언어라고 생각하십니까?
Roland Illig

3
@RolandIllig Ouch. 내 대답은 다른 문화를 수용하지 못합니다. 그것은 단점입니다. 더 많은 문화에 대한 지원을 넓히는 것에 대한 통찰력을 환영합니다. 세상은 협력자들과 함께하는 더 좋은 곳입니다.
Todd

1

더 나은 검색을하려면 다음 코드를 사용하십시오.

var myFav   = "javascript";
var theList = "VB.NET, C#, PHP, Python, JavaScript, and Ruby";

// Check for matches with the plain vanilla indexOf() method:
alert( theList.indexOf( myFav ) );

// Now check for matches in lower-cased strings:
alert( theList.toLowerCase().indexOf( myFav.toLowerCase() ) );

첫 번째 alert ()에서 JavaScript는 "-1"을 반환했습니다. 즉, indexOf ()는 일치하는 항목을 찾지 못했습니다. 이는 단순히 "JavaScript"가 첫 번째 문자열에서 소문자이고 두 번째 문자열에서 올바르게 대문자로 표시 되었기 때문입니다. indexOf ()를 사용하여 대소 문자를 구분하지 않는 검색을 수행하기 위해 두 문자열을 모두 대문자 또는 소문자로 만들 수 있습니다. 즉, 두 번째 alert ()에서와 같이 JavaScript는 찾고자하는 문자열의 발생 만 확인하고 대문자는 무시합니다.

참조, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm


1

경우 referrer배열, 당신은 사용할 수 있습니다findIndex()

 if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}

0

여기 내 테이크가있다 :

스크립트 :

var originalText = $("#textContainer").html()
$("#search").on('keyup', function () {
  $("#textContainer").html(originalText)
  var text = $("#textContainer").html()
  var val = $("#search").val()
  if(val=="") return;
  var matches = text.split(val)
  for(var i=0;i<matches.length-1;i++) {
    var ind =  matches[i].indexOf(val)
    var len = val.length
      matches[i] = matches[i] + "<span class='selected'>" + val + "</span>"
  }
  $("#textContainer").html(matches.join(""))

HTML :

<input type="text" id="search">
<div id="textContainer">
lorem ipsum is simply dummy text of the printing and typesetting industry. lorem ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of letraset sheets containing lorem ipsum passages, and more recently with desktop publishing software like Aldus pagemaker including versions of lorem ipsum.</div>

코드 펜

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.