следуя идее Mijoja и опираясь на проблемы, выявленные JasonS, у меня появилась эта идея; Я немного проверил, но не уверен в себе, поэтому было бы здорово проверить кого-то более опытного, чем я, в js regex :)
var re = /(?=(..|^.?)(ll))/g
// matches empty string position
// whenever this position is followed by
// a string of length equal or inferior (in case of "^")
// to "lookbehind" value
// + actual value we would want to match
, str = "Fall ball bill balll llama"
, str_done = str
, len_difference = 0
, doer = function (where_in_str, to_replace)
{
str_done = str_done.slice(0, where_in_str + len_difference)
+ "[match]"
+ str_done.slice(where_in_str + len_difference + to_replace.length)
len_difference = str_done.length - str.length
/* if str smaller:
len_difference will be positive
else will be negative
*/
} /* the actual function that would do whatever we want to do
with the matches;
this above is only an example from Jason's */
/* function input of .replace(),
only there to test the value of $behind
and if negative, call doer() with interesting parameters */
, checker = function ($match, $behind, $after, $where, $str)
{
if ($behind !== "ba")
doer
(
$where + $behind.length
, $after
/* one will choose the interesting arguments
to give to the doer, it's only an example */
)
return $match // empty string anyhow, but well
}
str.replace(re, checker)
console.log(str_done)
мой личный вывод:
Fa[match] ball bi[match] bal[match] [match]ama
принцип заключается в том, чтобы вызывать checker
в каждой точке строки между любыми двумя символами, когда эта позиция является начальной точкой:
--- любая подстрока с размером ненужного (здесь 'ba'
, то есть ..
) (если этот размер известен; в противном случае, возможно, сделать это будет сложнее)
--- --- или меньше этого, если это начало строки: ^.?
и, после этого,
--- что нужно искать (здесь 'll'
).
При каждом вызове checker
будет проверяться, не является ли значение до ll
тем, что нам не нужно (!== 'ba'
); если это так, мы вызываем другую функцию, и именно эта (doer
) будет вносить изменения в str, если целью является эта или, в более общем смысле, то она получит во входных данных необходимые данные. вручную обработать результаты сканирования str
.
здесь мы меняем строку, поэтому нам нужно было отслеживать разницу в длине, чтобы сместить места, заданные replace
, все рассчитано на str
, что само по себе никогда не меняется.
, поскольку примитивные строки являются неизменяемыми, мы могли бы использовать переменную str
для хранения результата всей операции, но я подумал, что пример, уже усложненный заменами, будет более понятным с другой переменной (str_done
) .
Я предполагаю, что с точки зрения производительности это должно быть довольно резким: все эти бессмысленные замены '' в '', this str.length-1
раз, плюс здесь ручная замена делателем, что означает много нарезки ...
вероятно, в этом конкретном вышеупомянутом случае, который можно сгруппировать, разрезая строку только один раз на части, где мы хотим вставить [match]
и .join()
, добавляя ее непосредственно в [match]
.
Другое дело, что я не знаю, как он справится с более сложными случаями, то есть со сложными значениями для фальшивого вида сзади ... длина, пожалуй, самая проблемная для получения данных.
и, в checker
, в случае множественных возможностей нежелательных значений для $ позади, мы должны будем выполнить тест на нем с еще одним регулярным выражением (которое лучше кэшировать (создавать) вне checker
, избегать создания одного и того же объекта регулярного выражения при каждом вызове для checker
), чтобы знать, действительно ли это то, чего мы стремимся избежать.
надеюсь, я был ясен; если не стесняйтесь, я постараюсь лучше. :)