Я использую библиотеку regex-applicative.
Я хочу удалить суффикс «.end», но только если это действительно суффикс (конец строки, а не где-то в середине строки) и использовать для него заменить.
replace (some anySym <* ".end") "start.end"
Работает: "start.end" -> "start"
Но это не работает с "start.end.extra" -> "start.extra" (я ожидаю результата "start.end.extra", потому что ".end" больше не суффикс - он в середине).
Я пытался:
replace (some anySym <* ".end" *> empty) "start.end"
replace (empty <* some anySym <* ".end" *> empty) "start.end"
и много других комбинаций, но это не работает, как я ожидаю. Можно ли удалить суффикс с помощью этой библиотеки?
@markalex не анализирует строку на наличие специального регулярного выражения-синтаксиса, поэтому «$» не является для нее специальным символом ($
буквально соответствует символу)
«Конец ввода» не является концепцией, которую библиотека рассматривает как часть поддерживаемого языкового пространства. Это просто выбор дизайна. Если это то, что вам нужно, эта библиотека не для вас.
@Carl Он недоступен как комбинатор, но match
и тому подобное позволяют вам требовать его на уровне всего регулярного выражения.
replace
предназначен для поиска всех мест в строке, где совпадает RE, и замены их чем-то другим. Вы этого не хотите, поэтому не используйте replace
. У вас есть регулярное выражение, определяющее, как вы хотите, чтобы вся строка была сформирована, поэтому match
на этом регулярном выражении, чтобы получить информацию из совпадения:
stripEndSuffix :: String -> String
stripEndSuffix =
let findSuffix = match $ some anySym <* string ".end"
in fromMaybe <*> findSuffix
Пробовали
\.end$
?