Сопоставление шаблона несколько раз с помощью регулярных выражений

#regex #stata

#регулярное выражение #stata

Вопрос:

Я пытаюсь сопоставить несколько вхождений одного и того же шаблона в строке. К сожалению, использование ustrregexs и ustrregexm возвращает только первое совпадение. Кроме того, я не знаю, сколько совпадений может быть, поэтому жесткие соответствия кодированию n не подходят. Есть ли способ найти все совпадения в Stata?

Пример:

 clear all

input x str250 y
1 "123 12"
2 "345 678"
3 "000 000 000"
4 "111"
5 "00"
6 "000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000000 000 000"
end

* Returns only the first match
gen match = ustrregexs(0) if ustrregexm(y, "(d{3}) ")
 

Ответ №1:

moss from SSC посвящен именно этому вопросу. Если «изначально» исключает команды, внесенные сообществом, тогда вам нужно написать свой собственный код.

 clear all

input x str20 y
1 "123 12"
2 "345 678"
3 "000 000 000"
4 "111"
5 "00"
end

moss y, match("([0-9][0-9][0-9])") regex 

list 

      -------------------------------------------------------------------------------- 
     | x             y   _count   _match1   _pos1   _match2   _pos2   _match3   _pos3 |
     |--------------------------------------------------------------------------------|
  1. | 1        123 12        1       123       1                 .                 . |
  2. | 2       345 678        2       345       1       678       5                 . |
  3. | 3   000 000 000        3       000       1       000       5       000       9 |
  4. | 4           111        1       111       1                 .                 . |
  5. | 5            00        0                 .                 .                 . |
      --------------------------------------------------------------------------------