2016-01-30 22 views
2
function hyphenate(str) { 

    var replace = "-"; 
    str = str.toLowerCase().replace(/[\s_\b]/g, replace); 

    console.log(str); 
    return str; 
} 

hyphenate("This Is Hyphenate"); // this-is-hyphenate 
hyphenate("camelCaseString"); // camel-case-string 

我试图让我的代码来产生第二函数调用的结果,但还没有确定可以做到这一点的模式。任何援助将不胜感激。正则表达式的骆驼字符串分割成单独的词

回答

3

注您的[\s_\b]中的\b表示退格字符。不知道你真的需要这个。

我会使用一个有点不同的逻辑:一个字内的每个大写字母前添加一个连字符,然后替换,把小写:

var re = /[\s_]+|([a-z0-9])(?=[A-Z])/g; 
 
var str = 'camelCaseString<br/>This  Is Hyphenate<br/>This_Should_Hyphenate'; 
 
var result = str.replace(re, "$1-").toLowerCase(); 
 
document.body.innerHTML += result;

说明:

  • [\s_]+ - 一个或多个空格或下划线
  • | - 或...
  • ([a-z0-9]) - (第1组),小写字母或数字(因为\B不让我们_匹配后,一个大写字母,添加A-Z如果你希望每个大写字母之前添加-
  • (?=[A-Z]) - 一个大写ASCII字母的测试(因为它是一个向前看,一个零宽度断言,所以没有被使用)。
+0

对不起,我之前的意思是说如何处理像这样的格式“This_Should_Hyphenate” – brndng

+0

'_'的问题是它被认为是一个单词字符。我加了一个修复程序。 –

+0

非常感谢。您给了我一些很好的线索,以了解更多关于正则表达式模式的知识。我非常感谢,因为我正在努力学习尽可能多的东西。所以,只有当大写字母跟在后面时,基本上lookahead([a-z0-9])(?= [A-Z])才匹配([a-z0-9])?我希望我正确理解这个逻辑。 “$ 1-”将在比赛结束后放置一个连字符? – brndng

1

lowercasing之前尝试前瞻:

function hyphenate(str) { 
    return str.split(/[\s_\b]|(?=[A-Z])/).join('-').toLowerCase(); 
} 
+0

这是一个非常优雅的答案,我需要对lookaheads进行一些研究。 – brndng

1

您可以使用捕捉组来获得小写其次是大写字母,然后转换整个字符串转换为小写:

str.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();