Есть ли разница в поведении параметризованных и буквальных регулярных выражений в Rascal? - PullRequest
0 голосов
/ 29 ноября 2018

Я работал над методом, который принимает регулярное выражение и строку для проверки этого выражения.

public bool match_case_insensitive(str regexp, str toMatch)
{
    bool match = /<regexp>/i := toMatch;
    if(match) println(toMatch);
    return match;
}

Предположим следующее регулярное выражение: (.*[e]){2}, которое соответствует любой строке как минимум с двумяЭ.Предположим, что следующая строка проверяется: merely

Вызов match_case_insensitive("(.*[e]){2}", "merely") вернет false.

Оценка выражения в терминале приведет к истине: /(.*[e]){2}/ := "merely" возвращает bool:true и то же самое для /(.*[e]){2}/i := "merely", если регистр не учитывается.

Я бы ожидал /<regexp>/i вмою функцию оценивать до /(.*[e]){2}/i, но это, по-видимому, неверно.Какая разница между выполнением необработанного сравнения в терминале и использованием этого метода?Я думаю, что Rascal не поддерживает захват групп, так как я не смог найти его в документации.Другая причина, по которой я могу придумать, заключается в том, что Rascal экранирует все строковые символы, и поэтому строка никогда не может содержать регулярное выражение, содержащее метасимволы.

1 Ответ

0 голосов
/ 29 ноября 2018
  1. вы правильно вывели, во время интерполяции Rascal будет экранировать метасимволы (я надеюсь, что все они), поэтому вы не сможете динамически создавать регулярные выражения.Так что regex="."; // := "bla" расширится до /\./ := "bla" еще до компиляции регулярного выражения.
  2. нотация поддерживает захват групп, использующих эту нотацию <name: regex>

    негодяй> если (//: = "aaabbb")

    >>>>> println (" - ");

    aaa - bbb

...