2016-09-09 17 views
0

私は角度アプリで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

私はこのコードはよりシンプルにすることができると確信していますが、私は正規表現ではあまりよくないので、私の質問は、この正規表現のルールをよりシンプルで美しくする方法ですか? 私は助けていただきありがとうございます。

これは、それはまだつもりだ私の例

+0

あなたは '.split()'文字列は、あなたが取得し、独自の変数にそれを破るしていることができます。あなたは正規表現の層をあまりにも多く使用しています。 –

+0

すべての中間変数は必要ありません。すべてのステートメントを1つの行にまとめるだけです(ただし、読みやすくするためにコードに改行を挿入してください)。 – 4castle

+0

シンプルで美しいが必要なら、正規表現はあなたが向ける場所ではありません。 –

答えて

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));

+0

ちょうど1つの単語 - "うわ"、たくさんありがとう!それは私のコードをよりシンプルにしているわけではありませんが、間違いなくそれをより良くします。 – antonyboom

1

とシンプルplunkerあるいくつかの層を必要とするが、それはむしろ大幅にこれを簡素化することが可能です:

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) 
} 

私は条件または2を逃したかもしれないが、それはです一般的なアイデア。

+0

私の例のように配列の代わりに文字列を作るが、私はあなたの考えを得た。ありがとう! – antonyboom

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));

関連する問題