Str.global_replace в OCaml ставит караты там, где их не должно быть - PullRequest
0 голосов
/ 19 апреля 2020

Я работаю над преобразованием многострочных строк в список токенов, с которыми мне было бы проще работать.

В соответствии с конкретными потребностями c моего проекта, я дополняю любой символ в каратах, который появляется в моем вводе, пробелами, так что "^" превращается в " ^ ". Для этого я использую что-то вроде следующей функции:

let bad_function string = Str.global_replace (Str.regexp "^") " ^ " (string)

Затем я использую что-то вроде функции ниже, чтобы затем превратить эту многострочную строку в список токенов (игнорируя пробел).

let string_to_tokens string = (Str.split (Str.regexp "[ \n\r\x0c\t]+") (string));;

По какой-то причине bad_function добавляет караты в места, где их не должно быть. Возьмите следующую строку кода:

(bad_function " This is some 
            multiline input 
            with newline characters 
            and tabs. When I convert this string
            into a list of tokens I get ^s showing up where 
            they shouldn't. ")

Первая строка строки превращается в:

^  This is some \n ^

Когда я передаю вывод из bad_function в string_to_tokens, я получаю следующий список:

string_to_tokens (bad_function " This is some 
            multiline input 
            with newline characters 
            and tabs. When I convert this string
            into a list of tokens I get ^s showing up where 
            they shouldn't. ")

["^"; "This"; "is"; "some"; "^"; "multiline"; "input"; "^"; "with";
 "newline"; "characters"; "^"; "and"; "tabs."; "When"; "I"; "convert";
 "this"; "string"; "^"; "into"; "a"; "list"; "of"; "tokens"; "I"; "get";
 "^s"; "showing"; "up"; "where"; "^"; "they"; "shouldn't."]

Почему это происходит и как я могу исправить, чтобы эти функции работали так, как я хочу?

1 Ответ

1 голос
/ 19 апреля 2020

Как объяснено в модуле Str .

^ Совпадения в начале строки: либо в начале совпавшей строки, либо сразу после символа '\ n' .

Таким образом, вы должны заключить в кавычки символ '^', используя escape-символ "\". Однако обратите внимание, что (также из do c)

любой символ backsla sh в регулярном выражении должен быть удвоен, чтобы он прошел после анализатора строк OCaml.

Это означает, что вы должны поставить двойное '\', чтобы делать то, что вы хотите, без предупреждения.

Это должно сделать работу:

let bad_function string = Str.global_replace (Str.regexp "\\^") " ^ " (string);;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...