Регулярное выражение для получения имени класса с определенной подстрокой

1

Мне нужно регулярное выражение в javascript, которое получит строку с определенной подстрокой из списка строк с разделителями пробелов.

Например, у меня есть:

  • widget util cookie i18n-username

Я хочу вернуть только i18n-username.

Как

  • 0
    Что должно произойти, если подстрока найдена более одного раза?
  • 0
    я не думал об этом, я полагаю, лучше всего было бы вернуть массив совпадений
Теги:

4 ответа

3
Лучший ответ

Вы можете использовать следующую функцию, используя регулярное выражение для соответствия вашей строке, окруженной пробелом или началом или концом строки. Но вы должны быть осторожны при подготовке любых специальных символов регулярного выражения, если вы планируете их использовать, поскольку аргумент поиска будет интерпретироваться как строка вместо литерала 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 должен быть действительно хороший механизм регулярных выражений!

  • 0
    Я предпочитаю находить имена классов с регулярным выражением: / \ bclassname \ b /
  • 0
    Спасибо maerics, мне нужно проверить строки, начинающиеся с i18n- *, и вернуть эту строку, а не true / false в зависимости от того, существует она или нет. регулярное выражение более эффективно в этом сценарии, или я должен вместо этого пойти по indexof route?
Показать ещё 2 комментария
1
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
  • 0
    Единственное, о чем вам нужно беспокоиться, это о том, содержит ли подстрока какие-либо специальные символы регулярного выражения.
  • 1
    Ваша функция регулярного выражения должна быть RegExp не RegEx .
Показать ещё 1 комментарий
0

Нужно ли быть регулярным выражением? Было бы достаточно знать, существует ли строка? Регулярные выражения неэффективны (медленнее), и их следует избегать, если это возможно:

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;
})();
  • 0
    У меня сложилось впечатление, что регулярные выражения были более эффективными, я думаю, что, возможно, меня дезинформировали. Существуют ли сценарии, где регулярное выражение может быть более эффективным? Кроме того, мне нужно проверить, чтобы строки, начинающиеся с i18n- *, должны были это прояснить. регулярное выражение более эффективно в этом сценарии?
  • 0
    Я буду обновлять пост, чтобы ответить на ваши вопросы.
-2

/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");
  • 0
    Я думаю, что вы имеете в виду класс [-a-zA-Z0-9_] . Но ove4rall, так как ti разделен пробелами, нет никакой реальной причины не просто использовать класс \S
  • 0
    Также слишком конкретный, он не сказал найти сильное, начинающееся с «i18n-», но нашел конкретную подстроку, чтобы что-то вроде /\S*substring\S*/ было бы более подходящим.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню