@@ -90,11 +90,14 @@ def to_sp
9090 pats = ""
9191 patg = [ ] # for (aa|bb|cc) group
9292 set = false
93+ set_negate = false
94+ options = [ ]
9395 capture = false
9496
9597 range = ""
9698 fixed_text = false
97- last_char = ( regexp . to_s . gsub ( "?-mix:" , "" ) . length ) - 2
99+ options = regexp . to_s . scan ( /\A \( \? ([mix]*)\- [mix]*:/ ) . join . split ( '' )
100+ last_char = ( regexp . to_s . gsub ( /\A \( \? [mix]*\- [mix]*:/ , "" ) . length ) - 2
98101 Regexp ::Scanner . scan regexp do |type , token , text , ts , te |
99102 if type == :escape
100103 if token == :dot
@@ -126,9 +129,9 @@ def to_sp
126129 pata [ -1 ] += pats . chop
127130 else
128131 if pats . size == 2
129- pata << pats . chop #jal
132+ pata << pats . chop
130133 else
131- pata << "1:[#{ pats } " #jal
134+ pata << "1:[#{ pats } "
132135 end
133136 if last_char == te and type == :literal and token == :literal
134137 pata << text
@@ -147,7 +150,6 @@ def to_sp
147150 pats = ""
148151 end
149152 fixed_text = false
150-
151153 case token
152154 when :open
153155 set = true
@@ -158,7 +160,13 @@ def to_sp
158160 if pats [ -1 ] == "["
159161 pats . chop!
160162 else
161- pats += "]"
163+ if set_negate
164+ pats +="%]*"
165+ set_negate = false
166+ else
167+ pats += "]"
168+ end
169+
162170 end
163171 elsif type == :group
164172 capture = false
@@ -169,6 +177,11 @@ def to_sp
169177 pats = ""
170178 end
171179 end
180+ when :negate
181+ if set and pats [ -1 ] == '['
182+ pats +="%"
183+ set_negate = true
184+ end
172185 when :capture
173186 capture = true if type == :group
174187 when :alternation
@@ -182,6 +195,7 @@ def to_sp
182195 end
183196 end
184197 when :range
198+ pats . chop! if options . include? ( 'i' )
185199 range = pats [ -1 ]
186200 pats . chop!
187201 when :digit
@@ -212,21 +226,37 @@ def to_sp
212226 pats = text [ -1 ]
213227 else
214228 pats += text
229+ pats += text . upcase if options . include? ( 'i' )
215230 end
216231 else
217232 range = range + "-" + text
218233 if range == "a-z"
219- pats = "x" + pats
234+ if options . include? ( 'i' )
235+ pats = "L" + pats
236+ else
237+ pats = "x" + pats
238+ end
220239 elsif range == "A-Z"
221- pats = "X" + pats
240+ if options . include? ( 'i' )
241+ pats = "L" + pats
242+ else
243+ pats = "X" + pats
244+ end
222245 elsif range == "0-9"
223246 pats = "n" + pats
224247 else
225- pats += if set
226- ( range [ 0 ] ..range [ 2 ] ) . to_a . join
227- else
228- "[" + ( range [ 0 ] ..range [ 2 ] ) . to_a . join + "]"
229- end
248+ if set
249+ pats += ( range [ 0 ] ..range [ 2 ] ) . to_a . join
250+ if options . include? ( 'i' )
251+ pats += ( range [ 0 ] ..range [ 2 ] ) . to_a . join . upcase
252+ end
253+ else
254+ trange = ( range [ 0 ] ..range [ 2 ] ) . to_a . join
255+ if options . include? ( 'i' )
256+ trange += trange . upcase
257+ end
258+ pats += "[" + trange + "]"
259+ end
230260 end
231261 range = ""
232262 end
0 commit comments