Mijoja의 아이디어를 따르고 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'
따라서,..
(그렇지 않으면 아마도 할 더 열심히해야 그 크기가 알려진 경우))
--- --- 또는 문자열의 시작 부분보다 작은 경우 : ^.?
그리고 이것에 따라
--- 실제로 찾는 것 (여기 'll'
).
를 호출 할 때마다 checker
이전 값 ll
이 원하지 않는 값인지 확인하는 테스트가 있습니다 ( !== 'ba'
). 이 경우 다른 함수를 호출하고 doer
, 목적이이 경우 또는보다 일반적으로 str을 변경하는 것은이 함수 ( ) 여야하며 , 수동으로 처리하는 데 필요한 데이터를 입력해야합니다. 스캔 결과str
.
여기서 우리는 문자열을 변경하여에 의해 주어진 위치를 상쇄하기 위해 길이의 차이를 추적해야했습니다 replace
.str
절대 변경 자체를.
원시 문자열은 변경할 수 str
없으므로 변수 를 사용하여 전체 작업의 결과를 저장할 수 있었지만 대체로 인해 복잡한 예제는 다른 변수와 더 명확하다고 생각했습니다.str_done
) .
나는 성능 측면에서 '' '',으로의 무의미한 대체, this str.length-1
시간, 그리고 doer에 의한 수동 교체 등 많은 슬라이싱을 의미합니다. 아마도 위의 특정 경우에는 우리는 삽입 할 위치 주위에 조각으로 한 번만 문자열을 절단하여, 그룹화 [match]
와 .join()
함께 보내고 [match]
그 자체.
다른 것은 더 복잡한 경우, 즉 가짜 lookbehind에 대한 복잡한 값을 처리하는 방법을 모른다는 것입니다. 길이는 아마도 가장 문제가되는 데이터 일 것입니다.
에서 checker
$ behind에 대해 원하지 않는 값이 여러 가지 가능성이있는 경우 checker
동일한 정규 표현식 객체가 생성되지 않도록 외부에서 캐싱 (만들기)하는 또 다른 정규 표현식으로 테스트 해야합니다. 각 호출에 checker
) 우리가 피하기 위해 무엇을 추구 있는지 여부를 알 수 있습니다.
내가 분명했으면 좋겠다. 망설이지 않으면 더 잘 할게요. :)