Это один из тех случаев, когда первоначальное постановка задачи, по-видимому, не очень полно, кажется, но если вы действительно хотите запускать только в случаях, которые производят символы между 32 и 126, это тривиальное изменение в решении I опубликовано ранее. Обратите внимание, что мое решение также обрабатывает случай с несколькими шаблонами (хотя эта первая версия не будет обрабатывать случаи, когда некоторые из соседних шаблонов находятся в диапазоне, а другие - нет).
dd = "0123456789"
ccp = "#" span(dd) $ n *lt(n,127) *ge(n,32) ";" *?(s = s char(n))
+ fence (*ccp | null)
rdl line = input :f(done)
repl line "&" *?(s = ) ccp = s :s(repl)
output = line :(rdl)
done
end
Нетрудно разобраться с этим случаем (например,; # 131; # 58; также выдает "; # 131 ;:":
dd = "0123456789"
ccp = "#" (span(dd) $ n ";") $ enc
+ *?(s = s (lt(n,127) ge(n,32) char(n), char(10) enc))
+ fence (*ccp | null)
rdl line = input :f(done)
repl line "&" *?(s = ) ccp = s :s(repl)
output = replace(line,char(10),"#") :(rdl)
done
end