包含不区分大小写

时间:2012-01-24 20:38:02

标签: javascript string case-sensitive case-insensitive

我有以下内容:

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

我喜欢做的是让Ral不区分大小写,以便它可以是RAlrAl等,并且仍然匹配。

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

14 个答案:

答案 0 :(得分:526)

.toLowerCase()之后添加referrer。此方法将字符串转换为小写字符串。然后,使用.indexOf()代替ral使用Ral

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

使用正则表达式也可以实现同样的效果(当您想要针对动态模式进行测试时尤其有用):

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

答案 1 :(得分:85)

另一个选择是使用搜索方法如下:

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

它看起来更优雅然后将整个字符串转换为小写,它可能更有效。
对于toLowerCase(),代码对字符串进行两次传递,一次传递在整个字符串上以将其转换为小写,另一次传递用于查找所需的索引。
使用RegExp代码对字符串进行一次传递,它看起来与所需的索引匹配。

因此,对于长字符串,我建议使用RegExp版本(我想在短字符串上这个效率来自于创建RegExp对象的帐号)

答案 2 :(得分:19)

使用RegExp:

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

或者,使用.toLowerCase()

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

答案 3 :(得分: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) { ...

答案 4 :(得分:9)

从ES2016开始,您还可以使用稍微更好/更容易/更优雅的方法:

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

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

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

答案 5 :(得分:4)

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

答案 6 :(得分: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

答案 7 :(得分:1)

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
  • 不要添加后缀 - Of指的是以下参数
  • 不要使用&#34; caseInsensitive&#34;这太长了
  • &#34;天然&#34;是一个很好的候选者,因为默认的区分大小写比较首先对人类来说并不自然。

为什么不......:

  • toLowerCase() - 可能会在同一个字符串上重复调用toLowerCase。
  • RegExp - 用变量搜索尴尬。甚至RegExp对象也不得不转义字符

答案 8 :(得分:1)

如果referrer是一个数组,则可以使用findIndex()

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

答案 9 :(得分:1)

任何语言的示例:

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

答案 10 :(得分:1)

您可以尝试

str = "Wow its so COOL"
searchStr = "CoOl"

console.log(str.toLowerCase().includes(searchStr.toLowerCase()))

答案 11 :(得分: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>

Codepen

答案 12 :(得分:0)

以下是 ES6 中按性能降序排列的选项

包括

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

IndexOf(有时会给出与 Includes 相似或更好的结果)

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

匹配

if (referrer.match(new RegExp("Ral", 'i'))) { ... }

基准测试结果:https://jsben.ch/IBbnl

答案 13 :(得分:0)

更好~!

if (~referrer.toUpperCase().indexOf("RAL")) { 
    console.log("includes")
}

enter image description here