Следуя идее Миджоджи, и, опираясь на проблемы, выявленные JasonS, у меня была эта идея; я проверил немного, но я не уверен в себе, так что проверка на кого-то более эксперта, чем у меня в Js регулярное выражение было бы здорово :)
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'
, таким образом ..
) (если размер известен; therwise это должно быть трудно сделать, возможно)
--- --- или меньше, если это начало строки: ^.?
и, после этого,
--- что (здесь 'll'
).
При каждом вызове checker
будет проведен тест, чтобы проверить, не является ли значение до ll
(!== 'ba'
); если это так, мы вызываем другую функцию, и она должна быть такой (doer
), которая будет вносить изменения на str, если целью является это, или более общее, которое будет вводить необходимые данные вручную обработать результаты сканирования str
.
здесь мы меняем строку, поэтому нам нужно сохранить след разности длин, чтобы компенсировать местоположения, заданные replace
, все рассчитано на str
, которое само по себе никогда не изменяется.
поскольку примитивные строки являются неизменными, мы могли бы использовать переменную str
для хранения результата всей операции, но я думал, что пример, уже осложнено replacings, будет понятнее, с другой переменной (str_done
).
я думаю, что с точкой зрения выступлений он должен быть довольно суровым: все эти бессмысленные заменами «» в «», this str.length-1
раз, плюс здесь ручная замена на делателе, что означает много нарезки ... вероятно, этот конкретный выше случай, который можно сгруппировать, разрезая строку только один раз на части вокруг, где мы хотим вставить [match]
и .join()
, используя его непосредственно с [match]
.
Другое дело в том, что я не знаю, как он обрабатывал бы более сложные случаи, то есть сложные значения для поддельного lookbehind ... длина, пожалуй, наиболее проблематичные данные для получения.
и в checker
, в случае множественных возможностей нежелательных значений для $ позади, нам нужно будет провести тест на него с еще одним регулярным выражением (для кэширования (создания) вне checker
лучше, чтобы избежать тот же объект регулярного выражения, который должен быть создан при каждом вызове для checker
), чтобы узнать, не хотим ли мы этого избежать.
надеюсь, что я был чист; если не без колебаний, я постараюсь лучше. :)
Рассмотрите возможность размещения регулярных выражений, как это выглядело бы с отрицательным lookbehind; что может облегчить ответ. –
Я добавил комментарий к [ответ, я думаю, имеет самое простое решение вашей проблемы] (http://stackoverflow.com/a/18392742/222134). –