javascript - строку - удалить символ из строки js
Как проверить, содержит ли строка подстроку в JavaScript? (20)
Обычно я ожидал бы String.contains()
, но, похоже, его нет.
Каков разумный способ проверить это?
String.prototype.indexOf()
или String.prototype.search()
?!
Как уже упоминалось, строки JavaScript имеют как метод String.prototype.indexOf и метод search
.
Ключевое различие между ними заключается в том, что indexOf
используется только для простых подстрок, тогда как search
также поддерживает регулярные выражения. Конечно, потенциал использования indexOf
заключается в том, что он быстрее.
См. Также В JavaScript, в чем разница между indexOf () и search ()? ,
Внедрение собственного String.prototype.contains()
Если вы хотите добавить свой собственный метод contains
к каждой строке, лучшим способом сделать это будет :
if (!String.prototype.contains) {
String.prototype.contains = function (arg) {
return !!~this.indexOf(arg);
};
}
Вы бы использовали его так:
'Hello World'.contains('orl');
Внедрение пользовательской библиотеки
Обычно, как правило, вы можете добавить свои собственные методы к стандартным объектам в JavaScript, например, потому что это может нарушить совместимость.
Если вы действительно хотите, чтобы ваш собственный метод contains
и / или другие настраиваемые строковые методы, лучше создать свою собственную библиотеку утилиты и добавить в эту библиотеку свои собственные строковые методы:
var helper = {};
helper.string = {
contains : function (haystack, needle) {
return !!~haystack.indexOf(needle);
},
...
};
Вы бы использовали его так:
helper.string.contains('Hello World', 'orl');
Использование сторонней библиотеки утилиты
Если вы не хотите создавать свою собственную вспомогательную библиотеку, есть, конечно, всегда возможность использовать стороннюю библиотеку утилиты. Как упоминалось , самыми популярными являются Lodash и Underscore.js .
В Lodash вы можете использовать _.includes()
, который вы используете следующим образом:
_.includes('Hello World', 'orl');
В Underscore.js вы можете использовать _.str.include()
, который вы используете следующим образом:
_.str.include('Hello World', 'orl');
ES6 содержит String.prototype.includes
.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
В ES6 у нас есть что-то, что включает в себя, что делает именно то, что вы хотите: так вы можете просто так:
'str1'.includes('str2');
Также в ES5 , если вы его широко используете, вы можете просто добавить его так:
String.prototype.includes = String.prototype.includes || function(str) {
return this.indexOf(str) > -1;
}
Вам нужно вызвать indexOf с капиталом «O», как упомянуто. Следует также отметить, что в классе JavaScript зарезервированное слово, вы должны использовать className для получения этого атрибута данных. Причина, по которой он, вероятно, терпит неудачу, состоит в том, что он возвращает нулевое значение. Вы можете сделать следующее, чтобы получить значение своего класса ...
var test = elm.getAttribute("className");
//or
var test = elm.className
Вот список текущих возможностей:
1. (ES6) includes
- перейдите к ответу
var string = "foo",
substring = "oo";
string.includes(substring);
2. ES5 и старше indexOf
var string = "foo",
substring = "oo";
string.indexOf(substring) !== -1;
String.prototype.indexOf
возвращает позицию строки в другой строке. Если не найден, он вернет -1
.
3. search
- перейдите к ответу
var string = "foo",
expr = /oo/;
string.search(expr);
4. lodash включает - перейдите к ответу
var string = "foo",
substring = "oo";
_.includes(string, substring);
5. RegExp - перейдите к ответу
var string = "foo",
expr = /oo/; // no quotes here
expr.test(string);
6. Матч - пойти, чтобы ответить
var string = "foo",
expr = /oo/;
string.match(expr);
Тесты производительности показывают, что indexOf
может быть лучшим выбором, если дело доходит до того, что скорость имеет значение.
Вы искали .indexOf
String.prototype.indexOf .
indexOf
будет возвращать индекс подстрочной подстроке. Индекс будет коррелировать с тем, где начинается подстрока. Если совпадения нет, возвращается -1. Вот простая демонстрация этой концепции:
var str = "Hello World"; // For example, lets search this string,
var term = "World"; // for the term "World",
var index = str.indexOf(term); // and get its index.
if (index != -1) { // If the index is not -1 then the term was matched in the string,
alert(index); // and we can do some work based on that logic. (6 is alerted)
}
Вы можете использовать метод search()
JavaScript search()
.
Синтаксис: string.search(regexp)
Он возвращает позицию совпадения, или -1, если совпадение не найдено.
См. Примеры: jsref_search
Вам не нужен сложный синтаксис регулярных выражений. Если вы не знакомы с ними, то st.search("title")
простой st.search("title")
. Если вы хотите, чтобы ваш тест был нечувствительным к регистру, вам следует выполнить st.search(/title/i)
.
Вы можете легко добавить метод contains
к String с помощью этого оператора:
String.prototype.contains = function(it) { return this.indexOf(it) != -1; };
Примечание: см. Комментарии ниже для допустимого аргумента для того, чтобы не использовать это. Мой совет: используйте свое собственное мнение.
В качестве альтернативы:
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; }
Если вы искали альтернативу для написания чек-уродливого -1, вместо этого вы добавляете ~ тильду.
if (~haystack.indexOf('needle')) alert('found');
Джо Циммерман - вы увидите, что использование ~ on -1 преобразует его в 0. Число 0 является значением false, что означает, что он будет вычисляться как false при преобразовании в Boolean. Сначала это может показаться неважным, но помните, что такие функции, как indexOf, возвращают -1, когда запрос не найден. Это означает, что вместо того, чтобы писать что-то похожее на это:
if (someStr.indexOf("a") >= 0) { // Found it } else { // Not Found }
Теперь у вас может быть меньше символов в коде, чтобы вы могли писать так:
if (~someStr.indexOf("a")) { // Found it } else { // Not Found }
Подробнее здесь
Используйте встроенный и самый простой, то есть match()
в строке. Чтобы достичь того, что вы ожидаете, сделайте следующее:
var stringData ="anyString Data";
var subStringToSearch = "any";
// This will give back the substring if matches and if not returns null
var doesContains = stringData.match(subStringToSearch);
if(doesContains !=null) {
alert("Contains Substring");
}
Код JavaScript для использования метода contains
в массиве:
<html>
<head>
<h2>Use of contains() method</h2>
<script>
Array.prototype.contains = function (element) {
for (var i = 0; i < this.length; i++) {
if (this[i] == element) {
return true;
}
}
return false;
}
arr1 = ["Rose", "India", "Technologies"];
document.write("The condition is "+arr1.contains("India")+"<br>");
</script>
</head>
<b>[If the specified element is present in the array, it returns true otherwise
returns false.]</b>
</html>
В данном коде метод contains
определяет, присутствует ли указанный элемент в массиве или нет. Если указанный элемент присутствует в массиве, он возвращает true, иначе он возвращает false.
Поскольку вопрос довольно популярен, я подумал, что могу добавить в код немного современный аромат.
// const : creates an immutable constant
const allLinks = document.getElementsByTagName("a");
// [].reduce.call : gives access to the reduce method on a HTMLCollection
// () => {} : ES6 arrow function
const foundLinks = [].reduce.call(allLinks, (sum, link) => {
// bitwise OR : converts the boolean value to a number
return sum + (link.classList.contains("title") | 0);
}, 0);
// template literal
console.log(`Found ${foundLinks || "no"} title class`);
BTW, правильным ответом является неправильный indexOf
или нестандартные String.contains
. Загрузка внешней библиотеки (особенно если код написан в чистом JavaScript) или возиться с String.prototype
или с использованием регулярного выражения немного переборщил.
Проблема с вашим кодом в том, что JavaScript чувствителен к регистру. Вызов метода
indexof()
на самом деле
indexOf()
Попробуйте его исправить и посмотрите, помогает ли это:
if (test.indexOf("title") !=-1) {
alert(elm);
foundLinks++;
}
Простой обходной путь
if (!String.prototype.contains) {
String.prototype.contains= function() {
return String.prototype.indexOf.apply(this, arguments) !== -1;
};
}
вы можете использовать следующим образом
"hello".contains("he") // true
"hello world".contains("lo w")//true
"hello world".contains("lo wa")//false
"hello world".contains(" ")//true
"hello world".contains(" ")//false
Чтобы собрать какие-то допустимые решения:
var stringVariable = "some text";
var findString = "text";
//using `indexOf()`
var containResult1 = stringVariable.indexOf(findString) != -1;
document.write(containResult1+', ');
//using `lastIndexOf()`
var containResult2 = stringVariable.lastIndexOf(findString) != -1;
document.write(containResult2+', ');
//using `search()`
var containResult3 = stringVariable.search(findString) != -1;
document.write(containResult3+', ');
//using `split()`
var containResult4 = stringVariable.split(findString)[0] != stringVariable;
document.write(containResult4+'');
Это просто сработало для меня. Он выбирает строки, которые не содержат термин «Удалено:»
if (eventString.indexOf("Deleted:") == -1)
пример
var a = "Test String";
if(a.search("ring")!=-1){
//exist
} else {
//not found
}
String.prototype.includes()
был введен в ES6.
Определяет, может ли одна строка быть найдена в другой строке, возвращая true или false, если это необходимо.
Синтаксис
var contained = str.includes(searchString [, position]);
параметры
searchString
Строка для поиска внутри этой строки.
position
Позиция в этой строке, в которой нужно начинать поиск по умолчанию для searchString
0.
пример
var str = "To be, or not to be, that is the question.";
console.log(str.includes("To be")); // true
console.log(str.includes("question")); // true
console.log(str.includes("To be", 1)); // false
Заметка
Это может потребовать прокладки ES6 в старых браузерах.
JavaScript
var str = "My big string contain apples and oranges";
var n = str.indexOf("apples");
alert(n); //will alert 22, -1 if not found
JQuery
<p>My big string contain apples and oranges</p>
alert($("p:contains(apples)")[0] != undefined); //will alert true if found
Общим способом записи метода contains
в JavaScript является:
if (!String.prototype.contains) {
String.prototype.contains = function (arg) {
return !!~this.indexOf(arg);
};
}
Оператор побитового отрицания ( ~
) используется для превращения -1
в 0
(false), а все остальные значения будут отличными от нуля (правдивые).
Операторы с двойным булевым отрицанием используются для перевода числа в логическое.