我有以下内容:
if (referrer.indexOf("Ral") == -1) { ... }
我喜欢做的是使 Ral
不区分大小写,以便它可以是 RAl
、rAl
等并且仍然匹配。
有没有办法说 Ral
必须不区分大小写?
RegExp
的陷阱。例如,用户可以输入 *
,然后在 RegExp
构造函数中抛出错误。公认的解决方案没有这个问题。
在 referrer
之后添加 .toUpperCase()
。此方法将字符串转换为大写字符串。然后,使用 RAL
而不是 Ral
来使用 .indexOf()
。
if (referrer.toUpperCase().indexOf("RAL") === -1) {
使用正则表达式也可以实现相同的目的(当您想要针对动态模式进行测试时特别有用):
if (!/Ral/i.test(referrer)) {
// ^i = Ignore case flag for RegExp
另一种选择是使用如下搜索方法:
if (referrer.search(new RegExp("Ral", "i")) == -1) { ...
它看起来更优雅,然后将整个字符串转换为小写,它可能更有效。
使用 toLowerCase()
时,代码对字符串进行两次遍历,一次遍历整个字符串以将其转换为小写,另一次遍历查找所需的索引。
使用 RegExp
时,代码进行一次遍历传递看起来与所需索引匹配的字符串。
因此,我建议在长字符串上使用 RegExp
版本(我猜在短字符串上这种效率来自于创建 RegExp
对象)
RegExp.test
会更快。所以在这个例子中:(new RegExp('Ral', 'i')).test(referrer)
从 ES2016 开始,您还可以使用稍微更好/更简单/更优雅的方法(区分大小写):
if (referrer.includes("Ral")) { ... }
或(不区分大小写):
if (referrer.toLowerCase().includes(someString.toLowerCase())) { ... }
以下是 .indexOf()
和 .includes()
的一些比较:https://dev.to/adroitcoder/includes-vs-indexof-in-javascript
includes
在 Chrome 中区分大小写:试试 'fooBar'.includes('bar')
==> false
使用正则表达式:
if (!/ral/i.test(referrer)) {
...
}
或者,使用 .toLowerCase()
:
if (referrer.toLowerCase().indexOf("ral") == -1)
这里有几种方法。
如果您只想对此实例执行不区分大小写的检查,请执行以下操作。
if (referrer.toLowerCase().indexOf("Ral".toLowerCase()) == -1) {
...
或者,如果您定期执行此检查,则可以向 String
添加一个类似 indexOf()
的新方法,但不区分大小写。
String.prototype.indexOfInsensitive = function (s, b) {
return this.toLowerCase().indexOf(s.toLowerCase(), b);
}
// Then invoke it
if (referrer.indexOfInsensitive("Ral") == -1) { ...
defineProperty
的现代浏览器,我建议使用 Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});
。两个更新:使用 (s+'')
进行显式字符串转换,循环中不可枚举(for(var i in '') ...
不显示 indexOfInsensitive
。
你可以试试这个
str = “哇,太酷了” searchStr = “CoOl” console.log(str.toLowerCase().includes(searchStr.toLowerCase()))
任何语言的示例:
'My name is Хведор'.toLocaleLowerCase().includes('ХвЕдОр'.toLocaleLowerCase())
if (referrer.toUpperCase().indexOf("RAL") == -1) { ...
以下是 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
要进行更好的搜索,请使用以下代码,
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
现在是 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
不要添加后缀词 - IndexOf 指的是以下参数。所以改为前缀一些东西。
不要使用“不区分大小写”前缀会很长
“自然”是一个很好的候选,因为默认的区分大小写的比较对人类来说首先是不自然的。
为什么不...:
toLowerCase() - 对同一字符串的潜在重复调用 toLowerCase。
RegExp - 使用变量搜索很尴尬。即使是 RegExp 对象也很尴尬,不得不转义字符
如果 referrer
是一个数组,您可以使用 findIndex()
if(referrer.findIndex(item => 'ral' === item.toLowerCase()) == -1) {...}
这是我的看法:
脚本:
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>
比较好~!
if (~referrer.toUpperCase().indexOf("RAL")) {
console.log("includes")
}
https://i.stack.imgur.com/bEexQ.png
toLocaleLowerCase()
(ref).search
方法:var index = referrer.search(/Ral/i);