正则表达式来获取具有特定子字符串的类名称
我需要一个JavaScript正则表达式,它将从空格分隔的字符串列表中获取具有特定子字符串的字符串。正则表达式来获取具有特定子字符串的类名称
例如,我有;
- 部件util的饼干国际化,用户名
我希望能够只返回国际化,用户名。
如何
你可以使用下面的函数,使用正则表达式来匹配你的字符串由空格或一行的开头或结尾包围。但你必须要小心准备任何正则表达式的特殊字符,如果你打算使用它们,因为搜索参数将被解释为一个字符串而不是一个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"
正如其他人所指出的,你也可以简单地用一个“分裂”和“的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;
};
[编辑]
注意分流/解决方案的indexOf可能快于大多数浏览器(虽然不是全部)。这jsPerf benchmark显示哪种解决方案对各种浏览器更快 - 特别是,Chrome必须有一个非常好的正则表达式引擎!
我喜欢用正则表达式查找类名是/ \ bclassname \ b/ – HBP 2011-06-01 08:42:44
感谢maerics,我需要检查以i18n- *开头的字符串并返回该字符串,而不是真/假取决于它是否存在。是在这种情况下更有效的正则表达式呢,还是我应该去indexof路线呢? – ClaraU 2011-06-01 09:31:44
@Hans B PUFAL:这是我的第一个想法,但它不起作用,因为CSS类可能包含连字符,所以使用正则表达式边界的解决方案会错误地匹配“i18n”和“username”等子字符串。 – maerics 2011-06-01 14:57:37
/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_]'。但是,由于ti是空白分隔的,所以没有真正的理由不使用'\ S'类。 – Jonathon 2011-06-01 01:57:08
同样过于具体,他没有说找到以“i18n-”开头的强项,而是找到了一个特定的子字符串,所以像'/ \ S * substring \ S * /'更合适。 – Jonathon 2011-06-01 01:59:23
嗯,他确实说过“我想只能返回i18n-username”。我将其解释为采用以i18n为前缀的用户名的类。这个问题不是很具体,所以这可能是不正确的解释。另外,'\ w'匹配'[A-Za-z0-9_]'。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/regexp – Chris 2011-06-01 02:28:26
这是否需要是一个正则表达式?知道弦是否存在就足够了?正则表达式是无效的(慢),应尽量避免使用:
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's 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;
})();
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
如果子字符串被多次发现,会发生什么? – HBP 2011-06-01 04:37:20
我还没有想到,我想最好的选择是返回匹配数组 – ClaraU 2011-06-01 09:56:59