OSDN Git Service

クラスメンバ定義順統一
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / StringUtils.java
1 /*\r
2  * string utilities\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2008 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf;\r
9 \r
10 import java.util.regex.Matcher;\r
11 \r
12 /**\r
13  * 文字列ユーティリティクラス。\r
14  */\r
15 public final class StringUtils{\r
16 \r
17     private static final int SUPLEN = 5;\r
18 \r
19 \r
20     /**\r
21      * ダミーコンストラクタ。\r
22      */\r
23     private StringUtils(){\r
24         super();\r
25         assert false;\r
26         throw new AssertionError();\r
27     }\r
28 \r
29 \r
30     /**\r
31      * 正規表現にマッチした領域を数値化する。\r
32      * @param seq 文字列\r
33      * @param matcher Matcher\r
34      * @param groupIndex 前方指定グループ番号\r
35      * @return 数値\r
36      * @throws IndexOutOfBoundsException 不正なグループ番号\r
37      */\r
38     public static int parseInt(CharSequence seq,\r
39                                 Matcher matcher,\r
40                                 int groupIndex     )\r
41             throws IndexOutOfBoundsException {\r
42         return parseInt(seq,\r
43                         matcher.start(groupIndex),\r
44                         matcher.end(groupIndex)   );\r
45     }\r
46 \r
47     /**\r
48      * 文字列を数値化する。\r
49      * @param seq 文字列\r
50      * @return 数値\r
51      */\r
52     public static int parseInt(CharSequence seq){\r
53         return parseInt(seq, 0, seq.length());\r
54     }\r
55 \r
56     /**\r
57      * 部分文字列を数値化する。\r
58      * @param seq 文字列\r
59      * @param startPos 範囲開始位置\r
60      * @param endPos 範囲終了位置\r
61      * @return パースした数値\r
62      * @throws IndexOutOfBoundsException 不正な位置指定\r
63      */\r
64     public static int parseInt(CharSequence seq, int startPos, int endPos)\r
65             throws IndexOutOfBoundsException{\r
66         int result = 0;\r
67 \r
68         for(int pos = startPos; pos < endPos; pos++){\r
69             char ch = seq.charAt(pos);\r
70             int digit = Character.digit(ch, 10);\r
71             if(digit < 0) break;\r
72             result *= 10;\r
73             result += digit;\r
74         }\r
75 \r
76         return result;\r
77     }\r
78 \r
79     /**\r
80      * 長い文字列を三点リーダで省略する。\r
81      * 「abcdefg」→「abc…efg」\r
82      * @param str 文字列\r
83      * @return 省略した文字列\r
84      */\r
85     public static CharSequence suppressString(CharSequence str){\r
86         String result = str.toString();\r
87         result = result.replaceAll("[\u0020\\t\\n\\r\u3000]", "");\r
88         if(result.length() <= SUPLEN * 2) return result;\r
89         int len = result.length();\r
90         String head = result.substring(0, SUPLEN);\r
91         String tail = result.substring(len - SUPLEN, len);\r
92         result = head + "…" + tail;\r
93         return result;\r
94     }\r
95 \r
96     /**\r
97      * ある文字列の末尾が別の文字列に一致するか判定する。\r
98      * @see String#endsWith(String)\r
99      * @param target 判定対象\r
100      * @param term 末尾文字\r
101      * @return 一致すればtrue\r
102      * @throws java.lang.NullPointerException 引数がnull\r
103      */\r
104     public static boolean isTerminated(CharSequence target,\r
105                                          CharSequence term)\r
106             throws NullPointerException{\r
107         if(target == null || term == null) throw new NullPointerException();\r
108 \r
109         int targetLength = target.length();\r
110         int termLength   = term  .length();\r
111 \r
112         int offset = targetLength - termLength;\r
113         if(offset < 0) return false;\r
114 \r
115         for(int pos = 0; pos < termLength; pos++){\r
116             char targetch = target.charAt(offset + pos);\r
117             char termch   = term  .charAt(0      + pos);\r
118             if(targetch != termch) return false;\r
119         }\r
120 \r
121         return true;\r
122     }\r
123 \r
124     /**\r
125      * サブシーケンス同士を比較する。\r
126      * @see CharSequence#subSequence(int,int)\r
127      * @param seq1 サブシーケンス1\r
128      * @param start1 開始インデックス1\r
129      * @param end1 終了インデックス1\r
130      * @param seq2 サブシーケンス2\r
131      * @param start2 開始インデックス2\r
132      * @param end2 終了インデックス2\r
133      * @return サブシーケンス1の方が小さければ負、大きければ正、等しければ0\r
134      * @throws IndexOutOfBoundsException 不正なインデックス指定\r
135      */\r
136     public static int compareSubSequence(\r
137             CharSequence seq1, int start1, int end1,\r
138             CharSequence seq2, int start2, int end2 )\r
139             throws IndexOutOfBoundsException{\r
140         int pos1 = start1;\r
141         int pos2 = start2;\r
142 \r
143         for(;;){\r
144             if(pos1 >= end1) break;\r
145             if(pos2 >= end2) break;\r
146             char ch1 = seq1.charAt(pos1);\r
147             char ch2 = seq2.charAt(pos2);\r
148             int diff = ch1 - ch2;\r
149             if(diff != 0) return diff;\r
150             pos1++;\r
151             pos2++;\r
152         }\r
153 \r
154         int length1 = end1 - start1;\r
155         int length2 = end2 - start2;\r
156 \r
157         if(length1 == length2) return 0;\r
158         if(length1 <  length2) return -1;\r
159         else                   return +1;\r
160     }\r
161 \r
162     /**\r
163      * 文字シーケンスとサブシーケンスを比較する。\r
164      * @see CharSequence#subSequence(int,int)\r
165      * @param seq1 文字シーケンス\r
166      * @param seq2 サブシーケンス\r
167      * @param start2 開始インデックス\r
168      * @param end2 終了インデックス\r
169      * @return 文字シーケンスの方が小さければ負、大きければ正、等しければ0\r
170      * @throws IndexOutOfBoundsException 不正なインデックス指定\r
171      */\r
172     public static int compareSubSequence(\r
173             CharSequence seq1,\r
174             CharSequence seq2, int start2, int end2 )\r
175             throws IndexOutOfBoundsException{\r
176         int result = compareSubSequence(seq1,      0, seq1.length(),\r
177                                         seq2, start2,          end2 );\r
178         return result;\r
179     }\r
180 \r
181     // TODO 文字エンコーダ・デコーダ処理の一本化。\r
182     // TODO 文字エンコーダ・デコーダのカスタム化。「~」対策など。\r
183 }\r