parser

Regex Split

Misha v.3 [24 августа 2011]

Приведённый ниже оператор rsplit — это оптимизированная версия одноименного оператора от Eugene Spearance. Целью оптимизации было уменьшение расхода памяти и ускорение работы, для чего код был избавлен от ручного создания и наполнения таблиц.

К сожалению, эта оптимизация привела к несовместимости результатов работы оригинального и модифицированного операторов. Оригинальный оператор возвращал или nameless таблицу или таблицу со столбцом 'piece', в то время как оптимизированный оператор возвращает или nameless таблицу или таблицу со столбцом с именем '1'.

Входные параметры операторов идентичны.

@rsplit[sText;sRegex;sDelimiter]
^if(def $sText && def $sRegex){
	$result[^sText.match[(.+?)(?:$sRegex|^$)][g]]
}{
	$result[^table::create{1}]
}
^if(def $sDelimiter){
	^if($result && (^sDelimiter.pos[r]>=0 || ^sDelimiter.pos[R]>=0)){
		$result[^table::create[$result;$.reverse(true)]]
	}
	^if(^sDelimiter.pos[v]>=0 || ^sDelimiter.pos[V]>=0){
		$result[^result.flip[]]
	}
}

P.S. Небольшое сравнение двух операторов на предмет потребляемой памяти и времени выполнения.