包含不区分大小写的


413

我有以下几点:

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

我想做的是使Ral大小写不敏感,以便可以RAlrAl等,仍然匹配。

有没有办法说Ral必须不区分大小写?


3
我认为不区分大小写的正则表达式是更优雅的解决方案,但是每个人都应牢记RegExp直接从用户输入创建直接输入的陷阱。例如,用户可以输入,*并且RegExp构造函数中将引发错误。公认的解决方案不存在此问题。
pllee

Answers:


604

.toLowerCase()在之后添加referrer。此方法将字符串转换为小写字符串。然后,使用.indexOf()using 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
后者不回答问题,只说是否存在,而不获取比赛的索引。问题标题错误,或者是问题。
马斯洛

10
@Maslow问题的示例是关于测试案例敏感性的。如果要获取索引,请使用String的.search方法:var index = referrer.search(/Ral/i);
Rob W

7
动态正则表达式方法的复杂之处在于,如果搜索字符串(例如“ Ral”)包含正则表达式特殊字符,例如$。*?。等等,您就会遇到问题,因此您需要转义特殊字符,请参见Mike Samuel在这篇文章中的回答:JavaScript中的
endsWith

94

另一种选择是使用搜索方法,如下所示:

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

然后看起来更优雅,然后将整个字符串转换为小写字母,这样可能会更有效率。
随着toLowerCase()代码有两个传过来的字符串,一个是通过对整个字符串将其转换为小写,另一个是寻找所需的索引。
通过RegExp该代码,可以在看起来与所需索引匹配的字符串上进行一次遍历。

因此,在长字符串上,我建议使用RegExp版本(我想在短字符串上,这种效率取决于创建RegExp对象)


2
根据我的测试,这也相当快:jsperf.com/case-insensitive-indexof
Ilan Biala

6
截至2018.10.24,toLowerCase在Chrome中大获全胜。toLowerCase(95,914,378-±0.89%-最快),regex indexOf(269,307-±0.87%100%慢)
nixkuroi


15

从ES2016起,您还可以使用稍微更好/更容易/更优雅的方法(区分大小写):

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

或(不区分大小写):

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

下面是一些比较.indexOf().includes()https://dev.to/adroitcoder/includes-vs-indexof-in-javascript


1
我认为include并不区分大小写
Kyle的

4
@Kyles includes区分大小写的 Chrome浏览器:尝试'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年,没有明确的方法来做到这一点?我希望有一些复制。我去吧

设计说明:我想最大程度地减少内存使用,从而提高速度-因此,没有字符串的复制/变异。我认为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
  • 不添加后缀-Of表示以下参数
  • 不要使用太长的“ caseInsensitive”
  • “自然”是一个不错的选择,因为默认情况下区分大小写的比较一开始就不自然。

为什么不...:

  • toLowerCase() -可能在同一字符串上重复调用toLowerCase。
  • RegExp-难以搜索变量。甚至RegExp对象也难以转义字符

2
是2016年,您仍然认为英语(或其他仅ASCII语言)是世界上唯一的语言吗?
罗兰·伊利格

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>

码笔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.