Мне нужно регулярное выражение в javascript, которое получит строку с определенной подстрокой из списка строк с разделителями пробелов.
Например, у меня есть:
Я хочу вернуть только i18n-username.
Как
Вы можете использовать следующую функцию, используя регулярное выражение для соответствия вашей строке, окруженной пробелом или началом или концом строки. Но вы должны быть осторожны при подготовке любых специальных символов регулярного выражения, если вы планируете их использовать, поскольку аргумент поиска будет интерпретироваться как строка вместо литерала RegExp:
var hasClass = function(s, klass) {
var r = new RegExp("(?:^| )(" + klass + ")(?: |$)")
, m = (""+s).match(r);
return (m) ? m[1] : null;
};
hasClass("a b c", "a"); // => "a"
hasClass("a b c", "b"); // => "b"
hasClass("a b c", "x"); // => null
var klasses = "widget util cookie i18n-username";
hasClass(klasses, "username"); // => null
hasClass(klasses, "i18n-username"); // => "i18n-username"
hasClass(klasses, "i18n-\\w+"); // => "i18n-username"
Как указывали другие, вы также можете просто использовать "split" и "indexOf":
var hasClass = function(s, klass) {
return (""+s).split(" ").indexOf(klass) >= 0;
};
Однако обратите внимание, что функция "indexOf" была введена в JavaScript несколько недавно, поэтому для более старых браузеров вам, возможно, придется реализовать ее самостоятельно.
var hasClass = function(s, klass) {
var a=(""+s).split(" "), len=a.length, i;
for (i=0; i<len; i++) {
if (a[i] == klass) return true;
}
return false;
};
[изменить]
Обратите внимание, что решение split/indexOf, скорее всего, будет быстрее для большинства браузеров (хотя и не для всех). Этот jsPerf benchmark показывает, какое решение выполняется быстрее для разных браузеров - особенно, у Chrome должен быть действительно хороший механизм регулярных выражений!
function getString(subString, string){
return (string.match(new RegExp("\S*" + subString + "\S*")) || [null])[0];
}
Для использования:
var str = "widget util cookie i18n-username";
getString("user", str); //returns i18n-username
RegExp
не RegEx
.
Нужно ли быть регулярным выражением? Было бы достаточно знать, существует ли строка? Регулярные выражения неэффективны (медленнее), и их следует избегать, если это возможно:
var settings = 'widget util cookie i18n-username',
// using an array in case searching the string is insufficient
features = settings.split(' ');
if (features.indexOf('i18n-username') !== -1) {
// do something based on having this feature
}
Если пробел не вызовет проблемы при поиске значения, вы можете просто выполнить поиск по строке напрямую:
var settings = 'widget util cookie i18n-username';
if (settings.indexOf('i18n-username') !== -1) {
// do something based on having this value
}
Затем становится легко сделать это в функцию многократного использования:
(function() {
var App = {},
features = 'widget util cookie i18n-username';
App.hasFeature = function(feature) {
return features.indexOf(feature) !== -1;
// or if you prefer the array:
return features.split(' ').indexOf(feature) !== -1;
};
window.App = App;
})();
// Here how you can use it:
App.hasFeature('i18n-username'); // returns true
ИЗМЕНИТЬ
Теперь вы говорите, что вам нужно вернуть все строки, которые начинаются с другой строки, и это можно сделать и с регулярным выражением, хотя я не уверен, насколько он эффективен:
(function() {
var App = {},
features = 'widget util cookie i18n-username'.split(' ');
// This contains an array of all features starting with 'i18n'
App.i18nFeatures = features.map(function(value) {
return value.indexOf('i18n') === 0;
});
window.App = App;
})();
/i18n-\w+/
должен работать. Если ваша строка имеет такие случаи, как другие подстроки, начинающиеся с i18n-
, или ваши имена пользователей имеют символы, которые не соответствуют классу [a-zA-Z0-9_]
, вам нужно указать это.
var str = "widget util cookie i18n-username";
alert(str.match(/i18n-\w+/));
/g
) и прокрутить совпадения.
var str = "widget i18n-util cookie i18n-username";
var matches = str.match(/i18n-\w+/g);
if (matches) {
for (var i = 0; i < matches.length; i++)
alert(matches[i]);
}
else
alert("phooey, no matches");
[-a-zA-Z0-9_]
. Но ove4rall, так как ti разделен пробелами, нет никакой реальной причины не просто использовать класс \S
/\S*substring\S*/
было бы более подходящим.