следуя идее 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
случае множественных возможностей нежелательных значений для $ behind, нам нужно будет проверить его с еще одним регулярным выражением ( checker
лучше кэшировать (создавать) снаружи ), чтобы избежать создания того же самого объекта регулярного выражения. при каждом вызове checker
) знать, действительно ли это то, чего мы стремимся избежать.
надеюсь, я был чист; если не стесняйтесь, я постараюсь лучше. :)