Как я могу создать список из нескольких совпадений с регулярными выражениями в Rascal?

У меня есть str значение, содержащее достаточное количество текста, и я сопоставляю его с регулярным выражением. str содержит несколько совпадений регулярного выражения, но, конечно, я получаю только первое. Как я могу перечислить по другим матчам, лучше, как я могу собрать их в list[str]? Пример:

str text = "hello here how home";

Теперь я могу сделать:

if (/<match:h+>/ := text) println(match);

который печатает первый матч: hello, Теперь вместо этого я хотел бы собрать все спички в list[str], Другие языки обеспечивают g флаг для глобального соответствия. Какова идиома Раскала для этого?

1 ответ

Решение

В общем, вы можете выполнять итерацию по шаблону, пока не будет найдено новых совпадений.

for (/<match:h+>/ := "hello here how home") {
   println(h);
}

или же

[ h | /<match:h+>/ := "hello here how home"]

обратное также верно, если вы хотите знать, есть ли хотя бы один элемент в списке:

if (_ <- lst) {
   println("lst is not empty");
}

Подробнее о сопоставлении с образцом и счетчиках читайте в репетиторе.

Если вы хотите сопоставить слово, вам, возможно, придется изменить регулярное выражение: /<word:h\w+>/

Другие вопросы по тегам