2011-09-19 15 views
0

たちは、文字列正規表現は、パイプで区切られた文字列の最後の5つの単語に与えられた単語と一致するように

blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow| 

を持って言って、私たちは「黄色」という言葉は、最後の5つのワードで発生するかどうかを把握したいです特に、これらの発生を含むキャプチャグループがある場合はそれを返します。

正規表現でそれを行う方法はありますか?

更新:私は正規表現エンジンにいくつかのルールを与えています。いろいろな理由で、私はエンジンの外に出るのではなくエンジンで作業しようとしています。これが私の最後の手段です。

+0

(\ w *)\ |キャプチャグループにとっては、逆の方向に進み、最初の5つの単語に限定する必要があります。 – Roxicus

+0

"最初の5"(あなたのコメントから)または "最後の5"(あなたの質問から)?なぜそれは正規表現でなければなりませんか?あなたは何らかの脳損傷APIを扱っていますか? –

+0

私の質問への私の更新を見てください。最後の5つ。 – Roxicus

答えて

3
/\b(yellow)\|(?=(?:\w+\|){0,4}$)/g 

これは、(「ワード」のあなたの定義あたり)より少ない5つの単語が続いています各yellow|ために1本のヒットを返します。これは、シーケンスが常にパイプで終わっていることを前提としています。 「このソリューションでは、「単語」の定義は任意である、とのdoesn:(コメントするに応じて)

/\b(yellow)(?=(?:\|\w+){0,4}\|?$)/g 

EDIT:それは場合でなければ、あなたはそれを変更する場合があります現実の世界の使用に本当に対応しています。

/\b(yellow)\|(?=(?:\w+(?:-\w+)*\|){0,4}$)/g 

...または、この特定のジョブのために、あなたはパイプ以外の任意の文字の一つ以上として言葉を定義することができます:「現実世界」のようなハイフネーションされた単語を可能にするには、これを使用することができます

/\b(yellow)\|(?=(?:[^|]+\|){0,4}$)/g 
+0

ニース。あなたがしたことを理解するためにいくつかの困惑を取ったが、それは動作する。興味深いサイドノート:Rubular.comはパイプなしで '黄色'を返し、javascriptで同じものは 'yellow |'を返すパイプで。パイプが私たちのキャプチャグループに含まれていないので不思議です。 – Roxicus

+0

明らかにRubularは、パイプを含まない最も高い番号のキャプチャグループ( '$ 1')の内容を返しています。 JavaScriptはそれを含む全体的なマッチ( '$ 0'または' $& ')を与えています。 (これは最初の正規表現ではもちろん、2番目の正規表現ではどちらの場合でもパイプは表示されません) –

+0

ちょうど文字列データのしわが見つかりました。時には私が単語と呼んでいるものは実際にダッシュを含んでいます。ダッシュは\ w +を使うことを意味していると思いますが、それは「yel-low」のダッシュで止まるからです。 \ w + \を置き換えようとしました。あなたの最初の正規表現では、\ /.*?\ |運がない。最後の5つの単語だけでなく、文字列内のどこかで 'yel-low'をキャプチャします。 – Roxicus

3

このような簡単なことのためにRegexを使う必要はありません。

は単にパイプに分割し、indexOfに確認してください:

var group = 'blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow'; 

if (group.split('|').slice(-5).indexOf('yellow') == -1) { 
    alert('Not there :('); 
} else { 
    alert('Found!!!'); 
} 

注:indexOfはネイティブにIE < 9でサポートされているが、それはadded very easilyことができるためのサポートされていません。

+1

申し訳ありませんが、より明確になっているはずです - さまざまな理由で正規表現でなければなりません。空の場合(最後の単語に黄色がない場合)、または文字列の最後の5単語に黄色の単語が含まれている場合のキャプチャグループとして結果を戻す必要があります。 – Roxicus

+2

@Roxicus - この新しい要件を実際の質問に入れてください(編集ボタンを使用してください)。あなたの質問に答えようとする人が誰でも見ることができます。問題を解決する最も簡単な方法ではない場合、正規表現の解決法を主張することは私たちにはあまりにも一般的であるように思われるので、その理由も説明したいかもしれません。それはあなたに興味のない回答を妨げるか、あなたの要求を満たす他の選択肢を求めます。 – jfriend00

0

これを単一の正規表現で行う方法は考えられませんが、最後の5つの位置ごとに1つずつ作成してマッチすることができます。

var string = "blue|blue|green|blue|blue|yellow|yellow|blue|yellow|yellow|"; 

var regexes = []; 
regexes.push(/(yellow)\|[^|]+\|[^|]+\|[^|]+\|[^|]+\|$/); 
regexes.push(/(yellow)\|[^|]+\|[^|]+\|[^|]+\|$/); 
regexes.push(/(yellow)\|[^|]+\|[^|]+\|$/); 
regexes.push(/(yellow)\|[^|]+\|$/); 
regexes.push(/(yellow)\|$/); 

var count = 0; 
var regex; 
while (regex = regexes.shift()) { 
    if (string.match(regex)) { 
    count++; 
    } 
} 

console.log(count); 

4つの一致が見つかります。