m.buettnerが推奨する逆の方法論も使用しましたが、パターンによってはかなりトリッキーになる可能性があります。単純なパターンまたは文字列に一致する場合、回避策がうまく機能することがわかりました。
そうは言っても、楽しみのために少し枠の外に出てみようと思いました。このソリューションには欠点がないわけではありませんが、うまく機能し、中程度から複雑な正規表現を使用して既存のコードに簡単に適応できるはずです。
http://jsfiddle.net/52QBx/
js:
function negativeLookBehind(lookBehindRegExp, matchRegExp, modifiers)
{
var text = $('#content').html();
var badGoodRegex = regexMerge(lookBehindRegExp, matchRegExp, modifiers);
var badGoodMatches = text.match(badGoodRegex);
var placeHolderMap = {};
for(var i = 0;i<badGoodMatches.length;i++)
{
var match = badGoodMatches[i];
var placeHolder = "${item"+i+"}"
placeHolderMap[placeHolder] = match;
$('#content').html($('#content').html().replace(match, placeHolder));
}
var text = $('#content').html();
var goodRegex = matchRegExp;
var goodMatches = text.match(goodRegex);
for(prop in placeHolderMap)
{
$('#content').html($('#content').html().replace(prop, placeHolderMap[prop]));
}
return goodMatches;
}
function regexMerge(regex1, regex2, modifiers)
{
/*this whole concept could be its own beast, so I just asked to have modifiers for the combined expression passed in rather than determined from the two regexes passed in.*/
return new RegExp(regex1.source + regex2.source, modifiers);
}
var result = negativeLookBehind(/(bad )/gi, /(good\d)/gi, "gi");
alert(result);
html:
<div id="content">Some random text trying to find good1 text but only when that good2 text is not preceded by bad text so bad good3 should not be found bad good4 is a bad oxymoron anyway.</div>
主なアイデアは、すべての合計パターン (後読みと実際の一致の両方) を見つけ、検索対象のテキストからそれらを一時的に削除することです。非表示の値が異なる可能性があるため、マップを利用したため、各置換を元に戻す必要がありました。次に、後読みに一致するアイテムが邪魔になることなく、本当に見つけたいアイテムの正規表現のみを実行できます。結果が決定された後、元の項目に戻して結果を返します。これは風変わりですが、機能的な回避策です。