包含不区分大小写

IT技术 javascript string case-sensitive case-insensitive
2021-01-25 05:13:44

我有以下几点:

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

我喜欢做的事情就是让Ral不区分大小写,因此,它可以是RAlrAl等,仍然匹配。

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

6个回答

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

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

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

if (!/Ral/i.test(referrer)) {
   //    ^i = Ignore case flag for RegExp
对于土耳其语,最好使用toLocaleLowerCase()( ref )
2021-03-16 05:13:44
正如其他地方的其他人指出的那样,最好使用 toUpperCase()。请参阅msdn.microsoft.com/en-us/library/bb386042.aspx
2021-03-27 05:13:44
@Maslow 问题的例子是关于测试案例不敏感。如果要获取索引,请使用String 的.search方法:var index = referrer.search(/Ral/i);
2021-03-29 05:13:44
后一种方法更正确;对于土耳其语 I 和任何其他此类有问题的大写/小写对,前者将失败:i18nguy.com/unicode/turkish-i18n.html
2021-04-06 05:13:44
动态正则表达式方法增加的复杂性是,如果搜索字符串(例如“Ral”)包含正则表达式特殊字符,例如 $.*? 等等,你会遇到问题,所以你需要转义特殊字符,请参阅 Mike Samuel 在这篇文章中的回答:endsWith in JavaScript
2021-04-10 05:13:44

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

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

它看起来比将整个字符串转换为小写更优雅,并且可能更有效。
随着toLowerCase()代码有两个传过来的字符串,一个是通过对整个字符串将其转换为小写,另一个是寻找所需的索引。
使用RegExp代码对它看起来与所需索引匹配的字符串进行一次传递。

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

对于性能极客,使用RegExp.test相同的基准在我的机器上使用速度更快。所以在这个例子中:(new RegExp('Ral', 'i')).test(referrer)
2021-03-16 05:13:44
截至 2018 年 10 月 24 日,toLowerCase 在 Chrome 中大获全胜。toLowerCase(95,914,378 - ±0.89% - 最快),regex indexOf(269,307 - ±0.87% 100% 慢)
2021-03-18 05:13:44
JSPerf 现在似乎已经死了,所以我在 JSBenchme 上重新创建了测试:jsbench.me/bckqv6ii1c/1 截至 2021 年,M1 Macbook Air Regex 比 indexOf 慢 99.43%。
2021-03-20 05:13:44
根据我的测试,这也快了一点:jsperf.com/case-insensitive-indexof
2021-04-05 05:13:44

从 ES2016 开始,您还可以使用更好/更简单/更优雅的方法(区分大小写):

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

或(不区分大小写):

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

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

@Kylesincludes区分大小写的Chrome浏览器:尝试'fooBar'.includes('bar')==>false
2021-03-15 05:13:44
我不认为包括不区分大小写
2021-03-29 05:13:44

使用正则表达式:

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

或者,使用.toLowerCase()

if (referrer.toLowerCase().indexOf("ral") == -1)
+1,通过避免“土耳其语 I 问题”和其他此类陷阱,这可能更正确:i18nguy.com/unicode/turkish-i18n.html
2021-03-17 05:13:44

这里有几种方法。

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

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) { ...
对于支持 的现代浏览器defineProperty,我建议Object.defineProperty(String.prototype, 'indexOfInsensitive', {value: function(s,b){return this.toLowerCase().indexOf((s+'').toLowerCase(),b);}});. 两个更新:显式字符串转换使用(s+''), 和不可枚举的循环(for(var i in '') ... 不显示indexOfInsensitive.
2021-04-01 05:13:44