2017-01-30 11 views
2

この問題がなぜ発生するのか知っていますが、解決する方法が必要です。Regexは入力文字列から消費していくつかの一致をスキップします

var str = "123+53ff+124+ks23+223+22+mo"; 

、私はこれを取得するnumberと2つの+兆候間の数字を置き換えたい:このよう/\+\d+\+/g

str = "123+53ff+number+ks23+number+number+mo"; 

をだから私はこの正規表現を使用して、私は、このような文字列を持って考えてみましょう

str = str.replace(/\+\d+\+/g, "+number+"); 

しかし、より多くの一致が(+3+4+5+...)互いの後がある場合にどのようなそれがないことは、それがいずれかと一致している、次をスキップし、それは1と一致した場合、それは右の+を消費するためだとそしてちょうどその+次の要素の後にマッチングを開始:なぜこれが起こっている、私は一種の知っている...後に1をスキップし、後

を1と一致技術的には+記号で囲まれていないため、一致しません。

は、入力が+3++4++5+であれば、結果は、各番号は独自の+記号で囲まれているため、予想通りである(1 +が消費されている場合、次のいずれかを行いますbeacause 1を消費することはここでの問題ではありません)。

私はreplaceを2度呼び出すことでこの問題を解決しました。しかし、これは非常にハッキーです。私はしっかりとした方法が欲しい。だから、ここで正規表現を動作させる方法は?または、2つの連続番号を同じにするには+記号を使用しますか?

注:私はこの特定の例の問題を解決したくありません(数字を+の間に置き換えてください)。それは単に問題の例だった。

EDIT:

それを行う方法がある場合は、することができます私はグループ+兆し?私はこれを行うことができます/(\+).../私は$1を使用してアクセスすることができますか?

答えて

4

、あなたは数字(s)は、以下の+の文字があるかどうかを判断するために、肯定先読みを使用することができます。それは先読みの一部であるため、そうすることで

、あなたが実際に続く+に一致していません。例えば

Example Here

/\+\d+(?=\+)/g 

"123+53ff+124+ks23+223+22+mo".replace(/\+\d+(?=\+)/g, "+number"); 

出力:

"123+53ff+number+ks23+number+number+mo" 

+number+number+ではなく)を使用して、後に続く+が一致しなくなったので、一致するものを置き換えることをお勧めします。

注:最初の1で十分であるよう/(\+)\d+(?=\+)/gあなたはグループに+兆候、グループこのような最初のものにしたい場合。 2番目のものは、次の試合で自動的にグループ分けされます。

4

正規表現は、重複しない一致のみを検索します。一致するものが見つかると、一致の終わりから検索が続行されます。あなたは試合自体に追加することなく、コンテキストを追加する前後参照アサーションを使用することができます。

/(?<=\+)\d+(?=\+)/ 

(?<=\+)は、現在の位置の前にプラスがあることを主張します。 (?=\+)は、現在の場所の後にプラスがあると主張します。どちらも幅がゼロです。

EDIT:JavaScriptにルックバックがないので、その場合は/\+\d(?=\+)/を実行することができます。

EDIT2:ルックアラージャのアサーションは、それ自体ではキャプチャしません。ルックアヘッドとマッチをグループ化することはできません。ただし、別々にグループ化して後で連結することができます。

/(\+)(\d+)(?=(\+))/ 

は3つすべてのものを提供します。重複マッチが一致しないので

+0

詳細については、このリンクをお試しください:http://www.regular-expressions.info/lookaround.html –

+0

JavaScriptには裏返しがありません。最初の '+'にマッチさせる必要があります。 – 4castle

+0

@ 4castle:Ah derpはタグを見ませんでした。 – Amadan

関連する問題