包含不区分大小写

我有以下几点:

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

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

是否有一种方法说Ral必须是不区分大小写的?

436292 次浏览

referrer之后添加.toUpperCase()。此方法将字符串转换为大写字符串。然后,使用RAL而不是Ral来使用.indexOf()

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

使用正则表达式也可以达到同样的效果(当你想测试动态模式时特别有用):

if (!/Ral/i.test(referrer)) {
//    ^i = Ignore case flag for RegExp
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...

使用RegExp:

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

或者,使用.toLowerCase():

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

这里有几种方法。

如果您希望仅对该实例执行不区分大小写的检查,请执行如下操作。

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

或者,如果你定期执行这个检查,你可以在String中添加一个新的类似__abc0的方法,但是不区分大小写。

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


// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -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将只检查所寻找的字符串是否出现,忽略大小写。

< p >参考, http://freewebdesigntutorials.com/javaScriptTutorials/jsStringObject/indexOfMethod.htm < / p >

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

if (referrer.search(new RegExp("Ral", "i")) == -1) { ...
它看起来比将整个字符串转换为小写更优雅,而且可能更有效。< br > 在toLowerCase()中,代码对字符串进行了两次传递,一次是对整个字符串进行传递,将其转换为小写,另一次是寻找所需的索引 在RegExp中,代码只传递了一次字符串,它查找匹配所需索引的字符串

因此,对于长字符串,我建议使用RegExp版本(我猜对于短字符串,这种效率来自于创建RegExp对象的帐户)

现在都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的名字
  • 不要添加后缀词—IndexOf指的是下面的参数。所以用前缀代替。
  • 不要使用“大小写不敏感”;前缀太长了
  • “natural"是一个很好的候选者,因为默认区分大小写的比较首先对人类来说并不自然。

为什么不…:

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

以下是我的看法:

脚本:

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>

< a href = " https://codepen.io/MichaelSel/pen/gmNGEX?editors=1111" rel="nofollow noreferrer"> code depen .

在ES2016中,你还可以使用稍微更好/更简单/更优雅的方法(区分大小写):

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

或(不区分大小写):

if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }
下面是.indexOf().includes()的一些比较: https://dev.to/adroitcoder/includes-vs-indexof-in-javascript < / p >

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

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

任何语言的例子:

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

你可以试试这个

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


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

以下是根据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

这样更好~!

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

enter image description here