regex: The first range in a character class can start with a left bracket

This commit is contained in:
Piotr Czarnecki 2014-10-24 16:38:23 +01:00
parent 48daba088b
commit f219773181
2 changed files with 8 additions and 5 deletions

View file

@ -374,10 +374,6 @@ impl<'a> Parser<'a> {
let mut ranges: Vec<(char, char)> = vec!();
let mut alts: Vec<Ast> = vec!();
if self.peek_is(1, ']') {
try!(self.expect(']'));
ranges.push((']', ']'))
}
while self.peek_is(1, '-') {
try!(self.expect('-'));
ranges.push(('-', '-'))
@ -411,7 +407,7 @@ impl<'a> Parser<'a> {
ast => fail!("Unexpected AST item '{}'", ast),
}
}
']' => {
']' if ranges.len() > 0 || alts.len() > 0 => {
if ranges.len() > 0 {
let flags = negated | (self.flags & FLAG_NOCASE);
let mut ast = AstClass(combine_ranges(ranges), flags);

View file

@ -53,6 +53,13 @@ fn quoted_bracket_set() {
assert_eq!(ms, vec![(0, 1), (1, 2)]);
}
#[test]
fn first_range_starts_with_left_bracket() {
let re = regex!(r"([[-z])");
let ms = re.find_iter("[]").collect::<Vec<(uint, uint)>>();
assert_eq!(ms, vec![(0, 1), (1, 2)]);
}
#[test]
fn range_ends_with_escape() {
let re = regex!(r"([\[-\x{5d}])");