2017-02-01 4 views
0

Использование Ruby 2.4. Если я хочу, чтобы выяснить позицию, где регулярное выражение встречается в строке, я могу сделатьКак определить, где заканчивается регулярное выражение?

2.4.0 :014 > line = "1 a b  c d" 
=> "1 a b  c d" 
2.4.0 :015 > string_tokens = ["a", "b", "c", "d"] 
=> ["a", "b", "c", "d"] 

2.4.0 :025 > first_pos = line.index(/#{string_tokens.join(" ").gsub(" ", "\s+")}/) 
=> 7 

, но как бы я определить положение, где регулярное выражение заканчивается в строке?

ответ

0
line = "1 a b  c d" 
string_tokens = ["a", "b", "c", "d"] 

Я считаю, что ОП предназначен для формирования регулярного выражения следующим образом.

r = /#{string_tokens.join('\s+')}/ 
    #=> /a\s+b\s+c\s+d/ 

Тогда

line =~ r 
    #=> 2 

говорит нам есть совпадение, начиная со смещения 2 из line. Чтобы найти, где заканчивается матч, мы можем использовать любой из следующих способов.

Первый способ

(line =~ r) + line[r].size - 1 
    #=> 12 

в

line[r] 
    #=> "a b  c d" 

Второй способ

Это использует Regexp::last_match и MachData#end.

line =~ r 
    #=> 2 

Regexp.last_match.end(0)-1 
    #=> 12 

LastMatchend(n) возвращает «смещение символа сразу после окончания го элемента массива соответствия в строке». Следовательно, потребность в -1.

Смежные вопросы