关于javascript:包含不区分大小写

Contains case insensitive

我有以下几点:

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

我喜欢做的是使Ral不区分大小写,这样它可以是RalRal等,并且仍然匹配。

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


referrer后加.toLowerCase()。此方法将字符串转换为小写字符串。然后,使用.indexOf(),使用ral,而不是ral

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

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

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


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

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

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

因此,对于长字符串,我建议使用RegExp版本(我猜,在短字符串中,这种效率是由于创建RegExp对象所致)。


使用ReGEXP:

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

或者,使用.toLowerCase()

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


这里有几种方法。

如果只想对此实例执行不区分大小写的检查,请执行以下操作。

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

或者,如果您定期执行此检查,您可以将新的indexOf()类方法添加到String中,但不区分大小写。

1
2
3
4
5
6
String.prototype.indexOfInsensitive = function (s, b) {
    return this.toLowerCase().indexOf(s.toLowerCase(), b);
}

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


从ES2016开始,您还可以使用更好/更简单/更优雅的方法:

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

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

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


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


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

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

现在是2016年,没有明确的方法来做这个?我想买些意大利面。我去试试。

设计说明:我希望最小化内存使用,从而提高速度——这样就不会复制/改变字符串。我假设V8(和其他发动机)可以优化此功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//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引用以下参数
  • 别用"不区分大小写"那太久了
  • "natural"是一个很好的候选者,因为默认的区分大小写的比较首先对人类来说是不自然的。

为什么不。。。:

  • toLowerCase()—对同一字符串上的tolowercase的潜在重复调用。
  • RegExp—难以用变量搜索。即使是regexp对象也很难转义字符


要进行更好的搜索,请使用以下代码,

1
2
3
4
5
6
7
8
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
2
3
4
5
6
7
8
9
10
11
12
13
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:

1
2
3
<input type="text" id="search">

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.

科德森