Я'пытаюсь заставить работать поиск без учета регистра с двумя строками в 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" (следующий пример не работает):
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);
Как я могу этого добиться?
Да, используйте .match
, а не .search
. Результат вызова .match
вернет собственно строку, которая была сопоставлена, но ее все равно можно использовать как булево значение.
var string = "Stackoverflow is the BEST";
var result = string.match(/best/i);
// result == 'BEST';
if (result){
alert('Matched');
}
Использование регулярного выражения, подобного этому, вероятно, самый аккуратный и очевидный способ сделать это в JavaScript, но имейте в виду, что это является регулярным выражением, и поэтому может содержать метасимволы regex. Если вы хотите взять строку из другого места (например, из пользовательского ввода), или если вы хотите избежать необходимости экранирования большого количества метасимволов, то вам, вероятно, лучше всего использовать 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');
}
Заменить
var result= string.search(/searchstring/i);
на
var result= string.search(new RegExp(searchstring, "i"));
Если вам нужен просто поиск строки, а не более сложное регулярное выражение, вы можете использовать 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;
Предположим, мы хотим найти строковую переменную игла
в строковой переменной haystack
. Есть три гоча:
string.toUpperCase
и string.toLowerCase
. Используйте регулярное выражение, которое вместо этого игнорирует случай. Например, var iglRegExp = новый RegExp (игла, "i");
, за которым следует иглаRegExp.test (haystack)
.игла
не содержала регулярного выражения [специальные символы][1]. Избегайте их, используя игла.replace (/ [- [\] {{{}}} () * +?., \\ ^ $ | # \ s] / g, "\\ $ &");
.игла
и 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);
[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions?redirectlocale = en-US & redirectslug = JavaScript% 2FGuide% 2FRegular_Expressions
ES6 +:
let string="Stackoverflow is the BEST";
let searchstring="best";
let found = string.toLowerCase()
.includes(searchstring.toLowerCase());
includes ()
возвращает true, если
searchStringпоявляется в одной или нескольких позициях, или
false` в противном случае.
Мне нравится ответ @ CHR15TO, в отличие от других ответов, которые я видел на других подобных вопросах, этот ответ фактически показывает, как правильно избежать пользовательской строки поиска (вместо того, чтобы говорить, что это будет необходимо, не показывая, как).
Тем не менее, это все еще довольно неуклюжий и, возможно, относительно медленный. Так почему бы не иметь конкретного решения того, что, вероятно, является общим требованием для кодеров? (И почему бы не включить его в API ES6 BTW?)
Мой ответ [https://stackoverflow.com/a/38290557/887092] по аналогичному вопросу позволяет следующее:
var haystack = 'A. BAIL. Of. Hay.';
var needle = 'bail.';
var index = haystack.naturalIndexOf(needle);
Есть два способа сравнения без учета регистра:
Преобразуйте строки в верхний регистр, а затем сравните их с помощью строгого оператора (===
). Как строгий оператор относится к операндам, читайте материал по адресу:
http://www.thesstech.com/javascript/relational-logical-operators
Сопоставление шаблонов с использованием строковых методов:
Используйте метод «поиск» для поиска без учета регистра. Читайте о поиске и других строковых методах по адресу: http://www.thesstech.com/pattern-matching-using-string-methods
& Лт;!doctype html >
< html >
& Лт; голова >
< сценарий >
// 1-й путь
вар а = "яблоко" ;
var b = "ЯБЛОКИ" ;
if (a.toUpperCase () === b.toUpperCase ()) {
оповещение («равное»);
}
// Второй путь
var a = "Нулевой и недействительный" ;
document.write (a.search (/ null / i));
< / script >
& Лт; / голова >
& Лт; / html >
Я делаю это часто и использую простой 5-строчный прототип, который принимает варарги. Это быстро и работает везде .
myString.containsIgnoreCase('red','orange','yellow')
& Лт;!- начать фрагмент: js hide: ложная консоль: истинная павиана: false - >
/**
* @param {...string} var_strings Strings to search for
* @return {boolean} true if ANY of the arguments is contained in the string
*/
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 Strings to search for
* @return {boolean} true if ALL of the arguments are contained in the string
*/
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
}
// Unit test
let content = `
FIRST SECOND
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
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 ? 'Found' : 'Not Found')
})
console.log('Searching for', 'x, y, foo')
result = 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');
console.log(result ? 'Found' : 'Not Found')
console.log('Searching for all', 'foo, bar')
result = content.containsAllIgnoreCase('foo', 'bar');
console.log(result ? 'Found' : 'Not Found')
& Лт;!- конец фрагмента - >
Я заметил, что если пользователь вводит строку текста, но оставляет ввод без выбора какого-либо из параметров автозаполнения, в скрытом вводе не устанавливается значение, даже если строка совпадает с значением в массиве. Итак, с помощью других ответов я сделал это:
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 );
}
}