正则表达式来获取具有特定子字符串的类名称

正则表达式来获取具有特定子字符串的类名称

问题描述:

我需要一个JavaScript正则表达式,它将从空格分隔的字符串列表中获取具有特定子字符串的字符串。正则表达式来获取具有特定子字符串的类名称

例如,我有;

  • 部件util的饼干国际化,用户名

我希望能够只返回国际化,用户名。

如何

+0

如果子字符串被多次发现,会发生什么? – HBP 2011-06-01 04:37:20

+0

我还没有想到,我想最好的选择是返回匹配数组 – ClaraU 2011-06-01 09:56:59

你可以使用下面的函数,使用正则表达式来匹配你的字符串由空格或一行的开头或结尾包围。但你必须要小心准备任何正则表达式的特殊字符,如果你打算使用它们,因为搜索参数将被解释为一个字符串而不是一个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必须有一个非常好的正则表达式引擎!

+0

我喜欢用正则表达式查找类名是/ \ bclassname \ b/ – HBP 2011-06-01 08:42:44

+0

感谢maerics,我需要检查以i18n- *开头的字符串并返回该字符串,而不是真/假取决于它是否存在。是在这种情况下更有效的正则表达式呢,还是我应该去indexof路线呢? – ClaraU 2011-06-01 09:31:44

+0

@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"); 
+0

我认为你的意思是类['-a-zA-Z0-9_]'。但是,由于ti是空白分隔的,所以没有真正的理由不使用'\ S'类。 – Jonathon 2011-06-01 01:57:08

+0

同样过于具体,他没有说找到以“i18n-”开头的强项,而是找到了一个特定的子字符串,所以像'/ \ S * substring \ S * /'更合适。 – Jonathon 2011-06-01 01:59:23

+1

嗯,他确实说过“我想只能返回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; 
})(); 
+0

我一直觉得正则表达式更有效率,我想我可能被误导了。有正则表达式可以更有效的场景吗?另外,我需要检查以i18n-开头的字符串是否应该清楚。在这种情况下是一个更有效的正则表达式呢? – ClaraU 2011-06-01 09:28:38

+0

我会更新帖子来回答你的问题。 – Eli 2011-06-01 12:49:25

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

唯一需要担心的是subString是否包含任何特殊的正则表达式字符。 – Jonathon 2011-06-01 01:51:12

+1

你的正则表达式函数应该是'RegExp'而不是'RegEx'。 – Eli 2011-06-01 03:34:25

+1

你的函数失败了,因为在这种情况下匹配返回null,所以找不到子串。这在这种情况下返回null:return(string.match(new RegExp(“\ S *”+ subString +“\ S *”))|| [null])[0]; – HBP 2011-06-01 04:43:53