View Javadoc
1   package com.github.mygreen.supercsv.cellprocessor.conversion;
2   
3   import java.util.regex.Matcher;
4   import java.util.regex.Pattern;
5   
6   import org.supercsv.cellprocessor.CellProcessorAdaptor;
7   import org.supercsv.cellprocessor.ift.CellProcessor;
8   import org.supercsv.cellprocessor.ift.StringCellProcessor;
9   import org.supercsv.util.CsvContext;
10  
11  /**
12   * 文字列を置換する{@link CellProcessor}です。
13   * 
14   * @version 2.2
15   * @since 1.2
16   * @author T.TSUCHIE
17   *
18   */
19  public class RegexReplace extends CellProcessorAdaptor implements StringCellProcessor {
20      
21      private final Pattern pattern;
22      
23      private final String replacement;
24      
25      private final boolean partialMatched;
26      
27      /**
28       * 正規表現と置換文字を指定してインスタンスを作成するコンストラクタ。
29       * 
30       * @param pattern コンパイル済みの正規表現。
31       * @param replacement 置換文字列
32       * @param partialMatched 部分一致で検索するかどうか。
33       * @throws NullPointerException if pattern or replacement is null.
34       */
35      public RegexReplace(final Pattern pattern, final String replacement, final boolean partialMatched) {
36          super();
37          checkPreconditions(pattern, replacement);
38          this.pattern = pattern;
39          this.replacement = replacement;
40          this.partialMatched = partialMatched;
41      }
42      
43      /**
44       * 正規表現と置換文字を指定してインスタンスを作成するコンストラクタ。
45       * 
46       * @param pattern コンパイル済みの正規表現。
47       * @param replacement 置換文字列
48       * @param partialMatched 部分一致で検索するかどうか。
49       * @param next チェインの中で呼ばれる次の{@link CellProcessor}.
50       * @throws NullPointerException if pattern or replacement is null.
51       */
52      public RegexReplace(final Pattern pattern, final String replacement, final boolean partialMatched,
53              final StringCellProcessor next) {
54          super(next);
55          checkPreconditions(pattern, replacement);
56          this.pattern = pattern;
57          this.replacement = replacement;
58          this.partialMatched = partialMatched;
59      }
60      
61      /**
62       * コンスタによるインスタンスを生成する際の前提条件となる引数のチェックを行う。
63       * 
64       * @param pattern コンパイル済みの正規表現
65       * @param replacement 置換する文字。
66       * @throws NullPointerException if pattern or replacement is null.
67       */
68      private static void checkPreconditions(final Pattern pattern, final String replacement) {
69          if(pattern == null ) {
70              throw new NullPointerException("regex should not be null");
71          }
72          
73          if(replacement == null) {
74              throw new NullPointerException("replacement should not be null");
75          }
76      }
77      
78      @Override
79      public <T> T execute(final Object value, final CsvContext context) {
80          
81          if(value == null) {
82              return next.execute(value, context);
83          }
84          
85          final Matcher matcher = pattern.matcher(value.toString());
86          final boolean matched = partialMatched ? matcher.find() : matcher.matches();
87          if(matched) {
88              final String result = matcher.replaceAll(replacement);
89              return next.execute(result, context);
90          }
91          
92          return next.execute(value, context);
93      }
94      
95      /**
96       * 
97       * @return 設定せれた正規表現
98       */
99      public String getRegex() {
100         return pattern.toString();
101     }
102     
103     /**
104      * 
105      * @return 正規表現のフラグ
106      */
107     public int getFlags() {
108         return pattern.flags();
109     }
110     
111     /**
112      * 
113      * @return 置換文字列を取得する
114      */
115     public String getReplacement() {
116         return replacement;
117     }
118 
119     /**
120      * 
121      * @return 部分一致で検索するかどうか。
122      */
123     public boolean isPartialMatched() {
124         return partialMatched;
125     }
126     
127     
128 }