ChatGPT解决这个技术问题 Extra ChatGPT

不区分大小写的搜索

我正在尝试在 JavaScript 中使用两个字符串进行不区分大小写的搜索。

通常它会是这样的:

var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);

/i 标志将不区分大小写。

但我需要搜索第二个字符串;没有标志,它可以完美运行:

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);

如果我将 /i 标志添加到上面的示例中,它将搜索 searchstring 而不是变量“searchstring”中的内容(下一个示例不起作用):

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);

我怎样才能做到这一点?


D
Dan

是的,使用 .match,而不是 .search.match 调用的结果将返回与其自身匹配的实际字符串,但它仍可用作布尔值。

var string = "Stackoverflow is the BEST";
var result = string.match(/best/i);
// result == 'BEST';

if (result){
    alert('Matched');
}

使用这样的正则表达式可能是 JavaScript 中最简洁和最明显的方法,但请记住它 一个正则表达式,因此可以包含正则表达式元字符。如果您想从其他地方获取字符串(例如,用户输入),或者如果您想避免转义大量元字符,那么您最好像这样使用 indexOf

matchString = 'best';
// If the match string is coming from user input you could do
// matchString = userInput.toLowerCase() here.

if (string.toLowerCase().indexOf(matchString) != -1){
    alert('Matched');
}

抱歉,如何在第一个示例中将“最佳”转换为变量? string.match(/best/i);
为什么要使用 .match 进行布尔比较。它在第一个结果之外进行搜索。您需要在第一次匹配 .test.search 后停止。检查性能 here
toLowerCase 很可能无法通过土耳其测试 (moserware.com/2008/02/does-your-code-pass-turkey-test.html) 和类似的案例转换问题。我不确定 ReGex 如何处理它,但如果我不得不猜测我会说得更好。
@DougMolineux,您可以使用 RegExp 对象构造函数。 var text = "best"; var exp = new RegExp(test, "i");。这与 /best/i 相同。
3
3 to 5 business days

代替

var result= string.search(/searchstring/i);

var result= string.search(new RegExp(searchstring, "i"));

这是一个相当混乱的方法,因为它需要采取措施来防止意外的正则表达式元字符。
丹,我怀疑我的回答应该得到你的 -1。我尝试通过纠正他对 JavaScript 的不当使用来帮助 ChrisBo,即: var result= string.search(/searchstring/i);到一个合适的,其中变量 searchstring 以他想要的方式使用。
Dan 是对的(尽管他的意思可能是“no 措施”):s = 'a[b'; r = new RegExp(s) 导致语法错误(未终止的字符类)
K
Kruti Patel

如果您只是搜索字符串而不是更复杂的正则表达式,则可以使用 indexOf() - 但请记住先将两个字符串都小写,因为 indexOf() 区分大小写:

var string="Stackoverflow is the BEST"; 
var searchstring="best";

// lowercase both strings
var lcString=string.toLowerCase();
var lcSearchString=searchstring.toLowerCase();

var result = lcString.indexOf(lcSearchString)>=0;
alert(result);

或者在一行中:

var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;

C
Chris Chute

假设我们要在字符串变量 haystack 中找到字符串变量 needle。有三个陷阱:

国际化应用程序应避免使用 string.toUpperCase 和 string.toLowerCase。改用忽略大小写的正则表达式。例如, var needleRegExp = new RegExp(needle, "i");其次是 needleRegExp.test(haystack)。一般来说,您可能不知道针的价值。注意 needle 不包含任何正则表达式特殊字符。使用 needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 转义这些。在其他情况下,如果您想精确匹配 needle 和 haystack,只需忽略大小写,请确保在正则表达式构造函数的开头添加“^”并在末尾添加“$”。

考虑到第 (1) 和 (2) 点,一个例子是:

var haystack = "A. BAIL. Of. Hay.";
var needle = "bail.";
var needleRegExp = new RegExp(needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i");
var result = needleRegExp.test(haystack);
alert(result);

A
Alexander Abakumov

ES6+:

let string="Stackoverflow is the BEST";
let searchstring="best";


let found = string.toLowerCase()
                  .includes(searchstring.toLowerCase());

如果 searchString 出现在一个或多个位置,则 includes() 返回 true,否则返回 false


d
dsomnus

如果您担心“未终止字符类”的情况,删除所有非字母数字字符会有所帮助:

searchstring = searchstring.replace(/[^a-zA-Z 0-9]+/g,'');

C
Community

我喜欢@CHR15TO 的答案,与我在其他类似问题上看到的其他答案不同,该答案实际上显示了如何正确转义用户提供的搜索字符串(而不是说有必要而不显示如何)。

但是,它仍然很笨重,并且可能相对较慢。那么,为什么不针对可能对编码人员的常见要求制定具体的解决方案呢? (为什么不将它包含在 ES6 API BTW 中?)

我对类似问题的回答 [https://stackoverflow.com/a/38290557/887092] 启用了以下功能:

var haystack = 'A. BAIL. Of. Hay.';
var needle = 'bail.';
var index = haystack.naturalIndexOf(needle);

S
Steven Spungin

我经常这样做,并使用一个简单的接受可变参数的 5 行原型。它速度很快,可以在任何地方使用。

myString.containsIgnoreCase('red','orange','yellow')

/** * @param {...string} var_strings 要搜索的字符串 * @return {boolean} 如果字符串中包含任何参数,则为 true */ String.prototype.containsIgnoreCase = function(var_strings) { const thisLowerCase = this.toLowerCase() for (let i = 0; i < arguments.length; i++) { let needle = arguments[i] if (thisLowerCase.indexOf(needle.toLowerCase()) >= 0) { return true } } return false } /** * @param {...string} var_strings 要搜索的字符串 * @return {boolean} 如果所有参数都包含在字符串中,则为 true */ String.prototype.containsAllIgnoreCase = function(var_strings) { const thisLowerCase = this.toLowerCase() for (let i = 0; i < arguments.length; i++) { let needle = arguments[i] if (thisLowerCase.indexOf(needle.toLowerCase()) === -1) { return false } } return true } // 单元测试 let content = `FIRST SECOND他们被欲望所蒙蔽,他们不提供,他们同样对那些因为心软,即逃避劳苦和痛苦而放弃职责的人感到内疚。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。故此诸智者持于此,或舍大乐而得其物,或忍苦舍重者。为了头脑的灵活性而履行职责,也就是逃避劳苦和痛苦。事实上,这些事物之间的区别是容易和权宜的。因为在空闲时间,当我们可以自由选择,没有什么能阻止我们做最让我们高兴的事情时,必须假设所有的快乐,拒绝所有的痛苦。但在某些时候,无论是因为职责,还是因为事情的需要,经常会发生既要拒绝快乐,又不要拒绝麻烦的情况。所以这些东西必须由一个聪明的人来选择,这样要么通过拒绝快乐来获得他人,要么通过忍受痛苦来排斥更严重的痛苦。” FOO BAR ` let data = [ 'foo', 'Foo', 'foobar ', 'barfoo', 'first', 'second' ] let result data.forEach(item => { console.log('Searching for', item) result = content.containsIgnoreCase(item) console.log(result ? '找到' : '未找到') }) console.log('正在搜索', 'x, y, foo') 结果 = content.containsIgnoreCase('x', 'y', 'foo'); console.log( result ? 'Found' : 'Not Found' ) console.log('Searching for all', 'foo, bar, foobar') result = content.containsAllIgnoreCase('foo', 'bar', 'foobar'); 控制台。 log(result ? 'Found' : 'Not Found') console.log('Searching for all', 'foo, bar') result = content.containsAllIgnoreCase('foo', 'bar'); console.log(result ? “找到”:“未找到”)


V
VLAZ

不区分大小写的比较有两种方式:

将字符串转换为大写,然后使用严格运算符 (===) 进行比较。使用字符串方法进行模式匹配:使用“搜索”字符串方法进行不区分大小写的搜索。


R
Robbert

您可以将所有内容设为小写:

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= (string.toLowerCase()).search((searchstring.toLowerCase()));
alert(result);

Y
Yogaraj K L

我正在尝试区分大小写的字符串搜索,我尝试了

 var result = string.toLowerCase().match(searchstring) 

并且

var result= string.search(new RegExp(searchstring, "i"));

但我做了一些小修改,这对我有用

var result = string.match(new RegExp(searchstring, "i"));

这将是小写,大写或组合


A
Ago

我注意到,如果用户输入一串文本但没有选择任何自动完成选项就离开了输入,即使该字符串与数组中的一个一致,也不会在隐藏的输入中设置任何值。所以,在其他答案的帮助下,我做了这个:

var $local_source = [{
        value: 1,
        label: "c++"
    }, {
        value: 2,
        label: "java"
    }, {
        value: 3,
        label: "php"
    }, {
        value: 4,
        label: "coldfusion"
    }, {
        value: 5,
        label: "javascript"
    }, {
        value: 6,
        label: "asp"
    }, {
        value: 7,
        label: "ruby"
    }];
    $('#search-fld').autocomplete({
        source: $local_source,
        select: function (event, ui) {
            $("#search-fld").val(ui.item.label); // display the selected text
            $("#search-fldID").val(ui.item.value); // save selected id to hidden input
            return false;
        },
        change: function( event, ui ) {

            var isInArray = false;

            $local_source.forEach(function(element, index){

                if ($("#search-fld").val().toUpperCase() == element.label.toUpperCase()) {
                    isInArray = true;
                    $("#search-fld").val(element.label); // display the selected text
                    $("#search-fldID").val(element.value); // save selected id to hidden input
                    console.log('inarray: '+isInArray+' label: '+element.label+' value: '+element.value);
                };

            });

            if(!isInArray){

                $("#search-fld").val(''); // display the selected text
                $( "#search-fldID" ).val( ui.item? ui.item.value : 0 );

            }
        }