简化一系列基于正则表达式的字符串替换

时间:2016-09-09 20:47:16

标签: javascript angularjs regex

所以我在我的角度应用中使用filter。此过滤器接受一个字符串并将其转换为文本。我在这个过滤器中有多个规则,因为每个字符串都是不同的。我逐步定义了这些规则,如下所示:

 .filter('filter', function () {

        return function (item) {
            var space = item.replace(/\./g, " ");
            var result = space.replace(/([A-Z])/g, " $1");
            var ids = result.replace(/Id==/g, " ");
            var categories = ids.replace(/Id=in=\(/g, ' ');
            var text = categories.replace(/title==/g, 'title: ');
            var desc = text.replace(/description==/g, 'description: ');

            var dots = desc.replace(/\*/g, ' ');
            var parants = dots.replace(/\)/g, ' ');
            var commas = parants.replace(/\,/g, '');

            var equal = commas.replace(/=/g, '');
            var more = equal.replace(/>/g, '');
            var line = more.replace(/-/g, '');
            var semidots = line.replace(/:/g, '');

            var numbers = semidots.replace(/[0-9]/g, '');

            var final = numbers.replace(/Z/g, '');
            return final.charAt(0).toUpperCase() + final.slice(1)

        }
    })

这是字符串

的示例
title==*test*;description==*some%20desciption*;eventTypeId==10;studyId==99999;priorityId==2;severityId==3;occuredDate%3E=2016-09-01T04:00:00.000Z

最终结果非常好,看起来像:

example of filter applied

我确信这段代码可以更简单,但我在正则表达式方面不是很好,所以我的问题是,如何让这个正则表达式规则更简单美观? 我感谢任何帮助。

使用我的示例

,这很简单plunker

3 个答案:

答案 0 :(得分:1)

它仍然需要一些层次,但可以大大简化这一点:

return function(item) {
    var replaced = item.replace(/([A-Z])/g, " $1")
        .replace(/(title|description)==/g, "$1: ")
        .replace(/Id=(?:in)?=|[.*()]/g, " ")
        .replace(/[\d=>:Z,-]/g, "")
    return replaced.charAt(0).toUpperCase() + replaced.slice(1)
}

我可能错过了一两个条件,但这是一般的想法。

答案 1 :(得分:1)

您可以使用字符类和OR |语句压缩许多正则表达式语句。

还有一些可以合并的陈述。



function filter(item) {
  item = item.replace(/[.)*]|(?:Id)?==/g, ' ')
             .replace(/[,=:>Z\d-]/g, '')
             .replace(/[A-Z]/g, ' $&');

  return item.charAt(0).toUpperCase() + item.slice(1);
}

var str = 'title==*test*;description==*some%20desciption*;eventTypeId==10;studyId==99999;priorityId==2;severityId==3;occuredDate%3E=2016-09-01T04:00:00.000Z';

console.log(filter(str));




答案 2 :(得分:1)

除了处理复杂的正则表达式之外,您可以采取的一种方法是管理按顺序应用的突变列表。

function filter(item){
   var replacements = [];

   replacements.push([/\./g, " "]);
   replacements.push([/([A-Z])/g, " $1"]);
   replacements.push([/Id==/g, " "]);
   replacements.push([/Id=in=\(/g, ' ']);
   replacements.push([/title==/g, 'title: ']);
   replacements.push([/description==/g, 'description: ']);
   replacements.push([/\*/g, ' ']);
   replacements.push([/\)/g, ' ']);
   replacements.push([/\,/g, '']);
   replacements.push([/=/g, '']);
   replacements.push([/>/g, '']);
   replacements.push([/-/g, '']);
   replacements.push([/:/g, '']);
   replacements.push([/[0-9]/g, '']);
   replacements.push([/Z/g, '']);
   
   for (var x = 0, r = replacements[0]; 
       x < replacements.length; 
       r = replacements[++x])
    item = item.replace(r[0], r[1]);
  
  return item.charAt(0).toUpperCase() + item.slice(1)
}

var items = 'title==*test*;description==*some%20desciption*;eventTypeId==10;studyId==99999;priorityId==2;severityId==3;occuredDate%3E=2016-09-01T04:00:00.000Z'.split(';');

console.log(items.map(filter));