javascript正则表达式

时间:2016-08-08 16:10:46

标签: javascript regex angular

我目前正在获取location.path网址,并将网址显示为我的标题,如果我有一个类似“香蕉和苹果”的标题,我怎么能让它成为camelcase我不想要“和”成为“和”,而只是回归“香蕉和苹果”

我找到了这个javascript代码,并将其标题恢复为“Banana And Apple”。

function camelize(str) {
        return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, index) {
            if (+match === 0) return " "; // or if (/\s+/.test(match)) for white spaces
            return index == 0 ? match.toLowerCase() : match.toUpperCase();
        });
    }

我将(/)和( - )替换为空格

this.title = camelize(lastPartOfUrl.replace(/\/|\-/g, ' '));

var cleanUrl = lastPartOfUrl.replace(/\/-/g, ' ');
this.title = camelize(cleanUrl.replace(/-/g, ' '));

3 个答案:

答案 0 :(得分:1)

基于单一RegEx的解决方案更短。

function camelCase(txt){
   var lower='and,or,a,in,on,'; //stop-words
   return txt //.split(/\/-/).join(' ')
           .toLowerCase().replace(/(\b.)(\S*\b)(\s|$)/g,
                      function(m/*full match*/,
                               n/*(\b.)*/,
                               p/*(\S*\b)*/,
                               q/*(\s|$)*/){
                        //console.log(n,p);
                        return (lower.indexOf(n+p+',')===-1?
                          n.toUpperCase() : n) + p + q;});
}

答案 1 :(得分:0)

String.prototype.capitalizeFirstLetter = function() {
  return this.charAt(0).toUpperCase() + this.slice(1);
};

String.prototype.toCamelCase = function() {
  return this.split(" ").reduce((previousValue, currentValue, currentIndex) => (currentIndex == 1) ? 
    previousValue.toLowerCase() + currentValue.capitalizeFirstLetter() :
    previousValue + currentValue.capitalizeFirstLetter()
  );
};
alert("Banana And Apples".toCamelCase())

编辑:大写单词,除了一个单词数组变为小写:

function titleCaseExcept(value, lowerCaseArray, upperCaseArray, isCaseSensitive) {
  var str = value.replace(/([^\W_]+[^\s-]*) */g, (txt) =>
    txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase()
  );
  var regexFlags = (isCaseSensitive) ? 'gi' : 'g';

  // Lower case words
  lowerCaseArray.forEach( (element) => 
    str = str.replace(new RegExp('\\s' + element + '\\s', regexFlags), 
      (text) => text.toLowerCase()
    )
  );
    
  // Upper case words
  upperCaseArray.forEach( (element) =>
    str = str.replace(new RegExp('\\b' + element + '\\b', regexFlags), 
      (text) => text.toUpperCase()
    )
  );
      
  return str;
}

// Find any of these, in any case, to replace to lowercase
lowers = ['A', 'an', 'THE', 'and', 'But', 'oR', 'For', 'Nor', 'As', 'At', 
  'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
// Find any of these, in any case, to replace to uppercase
uppers = ['id', 'tv'];

// Last parameter is true for case-insensitive arrays
console.log(upperCaseExcept("Bananas And Apples In Some Place On Tv", lowers, uppers, true));

答案 2 :(得分:0)

除非你诉诸Nick Bull的解决方案或类似方法,否则在任何计算机语言中都没有一种连贯的方法。

问题是计算机程序不认识'香蕉'是一种与'和'不同的单词 - 即:'香蕉'是名词,'和'是一种结合。

您必须使用您对字符串中可能包含的内容的知识(与Nick Bull的解决方案一样),或接受一个更简单的解决方案,您可能只需将第一个字母大写并承担后果。

(我知道我选择哪个)