3

私は正規表現が苦手なので、私の問題をよりよく説明しようとするという名目で、少し慣例にとらわれずに質問を伝えます。

var TheBadPattern = /(\d{2}:\d{2}:\d{2},\d{3})/;
var TheGoodPattern = /([a-zA-Z0-9\-,.;:'"])(?:\r\n?|\n)([a-zA-Z0-9\-])/gi;

// My goal is to then do this
inputString = inputString.replace(TheGoodPattern, '$1 $2);

質問:私はすべての良いパターンに一致し、その後の検索/置換を行いたいのですが、それらが悪いパターンによって進められていない限り、どのように考えていますか? 後読みをサポートする他の言語でこれを達成できましたが、後読みがないと途方に暮れますか? (ps:私が理解していることから、JSは先読み/後読みをサポートしていません。または、必要に応じて、「?>!」、「?<=」)

4

2 に答える 2

2

JavaScript は先読みをサポートしています。また、後読みだけが必要なので (先読みも必要ありません)、回避策があります (コードの可読性にはあまり役立ちませんが、機能します!)。したがって、文字列とパターンの両方を逆にすることができます。

inputString = inputString.split("").reverse().join("");
var pattern = /([a-z0-9\-])(?:\n\r?|\r)([a-z0-9\-,.;:'"])(?!\d{3},\d{2}:\d{2}:\d{2})/gi
inputString = inputString.replace(TheGoodPattern, '$1 $2');
inputString = inputString.split("").reverse().join("");

大文字を冗長に使用していたことに注意してください (i修飾子に対応しています)。

入力例を提供していただければ、実際にテストします。

于 2012-12-08T01:05:01.067 に答える
1

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>​

主なアイデアは、すべての合計パターン (後読みと実際の一致の両方) を見つけ、検索対象のテキストからそれらを一時的に削除することです。非表示の値が異なる可能性があるため、マップを利用したため、各置換を元に戻す必要がありました。次に、後読みに一致するアイテムが邪魔になることなく、本当に見つけたいアイテムの正規表現のみを実行できます。結果が決定された後、元の項目に戻して結果を返します。これは風変わりですが、機能的な回避策です。

于 2012-12-08T03:30:36.437 に答える