OSDN Git Service

SHORTMEMBERイベントに対応
[jindolf/JinParser.git] / src / main / java / jp / sourceforge / jindolf / parser / SeqRange.java
1 /*\r
2  * range of string\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2009 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf.parser;\r
9 \r
10 import java.util.regex.MatchResult;\r
11 \r
12 /**\r
13  * 文字列の範囲を表す。\r
14  * 範囲は開始位置と終了位置で表される。\r
15  * 開始位置と終了位置が同じ場合、長さ0の範囲とみなされる。\r
16  * 開始位置0は文字列の左端を表す。\r
17  * 開始位置が負の場合、もしくは開始位置より終了位置が小さい場合、\r
18  * このオブジェクトは無効とみなされる。\r
19  */\r
20 public class SeqRange{\r
21 \r
22     private int startPos;\r
23     private int endPos;\r
24 \r
25     /**\r
26      * コンストラクタ。\r
27      * 開始位置、終了位置ともに無効状態となる。\r
28      */\r
29     public SeqRange(){\r
30         this(-1, -1);\r
31         return;\r
32     }\r
33 \r
34     /**\r
35      * コンストラクタ。\r
36      * @param startPos 開始位置\r
37      * @param endPos 終了位置\r
38      */\r
39     public SeqRange(int startPos, int endPos){\r
40         super();\r
41         this.startPos = startPos;\r
42         this.endPos   = endPos;\r
43         return;\r
44     }\r
45 \r
46     /**\r
47      * 開始位置を設定する。\r
48      * @param startPos 開始位置\r
49      */\r
50     public void setStartPos(int startPos){\r
51         this.startPos = startPos;\r
52         return;\r
53     }\r
54 \r
55     /**\r
56      * 終了位置を設定する。\r
57      * @param endPos 終了位置\r
58      */\r
59     public void setEndPos(int endPos){\r
60         this.endPos = endPos;\r
61         return;\r
62     }\r
63 \r
64     /**\r
65      * 開始位置と終了位置を設定する。\r
66      * @param startPosition 開始位置\r
67      * @param endPosition 終了位置\r
68      */\r
69     public void setRange(int startPosition, int endPosition){\r
70         this.startPos = startPosition;\r
71         this.endPos   = endPosition;\r
72         return;\r
73     }\r
74 \r
75     /**\r
76      * 最後にマッチした前方参照グループの範囲で設定する。\r
77      * @param result 正規表現マッチ結果\r
78      * @param groupId グループ番号\r
79      * @throws IllegalStateException マッチしていない\r
80      * @throws IndexOutOfBoundsException グループ番号が不正\r
81      */\r
82     public void setLastMatchedGroupRange(MatchResult result, int groupId)\r
83             throws IllegalStateException,\r
84                    IndexOutOfBoundsException {\r
85         this.startPos = result.start(groupId);\r
86         this.endPos   = result.end(groupId);\r
87         return;\r
88     }\r
89 \r
90     /**\r
91      * 最後にマッチした範囲全体で設定する。\r
92      * @param result 正規表現マッチ結果\r
93      * @throws IllegalStateException マッチしていない\r
94      */\r
95     public void setLastMatchedRange(MatchResult result)\r
96             throws IllegalStateException {\r
97         this.startPos = result.start();\r
98         this.endPos   = result.end();\r
99         return;\r
100     }\r
101 \r
102     /**\r
103      * 開始位置を取得する。\r
104      * @return 開始位置\r
105      */\r
106     public int getStartPos(){\r
107         return this.startPos;\r
108     }\r
109 \r
110     /**\r
111      * 終了位置を取得する。\r
112      * @return 終了位置\r
113      */\r
114     public int getEndPos(){\r
115         return this.endPos;\r
116     }\r
117 \r
118     /**\r
119      * 範囲の長さを得る。\r
120      * 内容が無効な場合、負の値もありえる。\r
121      * @return 長さ\r
122      */\r
123     public int length(){\r
124         int length = this.endPos - this.startPos;\r
125         return length;\r
126     }\r
127 \r
128     /**\r
129      * 現在の範囲で与えられた文字列を切り出す。\r
130      * @param seq 切り出し元文字列\r
131      * @return 切り出された文字列\r
132      * @throws IndexOutOfBoundsException 範囲が無効\r
133      */\r
134     public CharSequence sliceSequence(CharSequence seq)\r
135             throws IndexOutOfBoundsException{\r
136         CharSequence result = seq.subSequence(this.startPos, this.endPos);\r
137         return result;\r
138     }\r
139 \r
140     /**\r
141      * 範囲指定を無効にする。\r
142      */\r
143     public void setInvalid(){\r
144         this.startPos = -1;\r
145         this.endPos   = -1;\r
146         return;\r
147     }\r
148 \r
149     /**\r
150      * 範囲指定が有効か判定する。\r
151      * @return 有効であればtrue\r
152      */\r
153     public boolean isValid(){\r
154         if     (this.startPos < 0)           return false;\r
155         else if(this.startPos > this.endPos) return false;\r
156         return true;\r
157     }\r
158 \r
159 }\r