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
、その位置が次の開始点であるときはいつでも、任意の2つの文字の間の文字列の各ポイントで呼び出すことです。
---不要なサイズの部分文字列(ここでは'ba'
、したがって..
)(そのサイズがわかっている場合。それ以外の場合は、おそらく実行が困難になるはずです)
--- ---または文字列の先頭の場合はそれよりも小さい: ^.?
そして、これに続き、
---実際に求められるもの(ここ'll'
)。
の呼び出しごとにchecker
、前の値が必要な値ll
でないかどうかを確認するテストがあります(!== 'ba'
); その場合は、別の関数を呼び出します。これdoer
がstrに変更を加えるのはこれ()である必要があります。目的がこれである場合、またはより一般的には、手動で処理するために必要なデータを入力で取得しますスキャンの結果str
。
ここで文字列を変更するため、で指定された位置をオフセットするために、長さの違いのトレースを維持する必要がありreplace
、すべてstr
、でがありました。
プリミティブ文字列は不変なので、str
操作全体の結果を格納するために変数を使用することもできますが、置換によってすでに複雑になっている例は、別の変数(str_done
)で。
パフォーマンスの観点からはかなり厳しいと思います: ''から ''への無意味な置換、this str.length-1
時間、そしてここではdoerによる手動の置換、つまり、スライスの多くを意味します...おそらくこの特定の上記のケースでは文字列を挿入[match]
したい場所の周りで1回だけ切り、それ自体.join()
と一緒にグループ化し[match]
ます。
もう1つは、より複雑なケース、つまり偽の後読みの複雑な値を処理する方法がわからないということです...長さはおそらく取得するのに最も問題のあるデータです。
また、checker
$ behindに不要な値が複数存在する可能性がある場合はchecker
、同じ正規表現オブジェクトが作成されないように、外部でキャッシュ(作成)するさらに別の正規表現でテストする必要があります。の各呼び出しでchecker
)をそれが私たちが避けようとしているものであるかどうかを知る必要があります。
私は明確になっていると思います。躊躇しないのであれば、私はもっと頑張ります。:)