2017-03-17 17 views
1

3語句のすべてのインスタンスに対して一致を返したいと思います。私は今、適切な文法を心配していません。私は要求の「マルチパス」の性質を達成する方法にもっと興味があります。3単語の文字列ごとに一致する正規表現

$string = "one two three four five"; 

$regex = '/(?:[^\\s\\.]+\\s){3}/ui'; 

preg_match_all($regex, $string, $matches); 

のみを返します:

one two three

必要な結果:

one two three

two three four

three four five

+0

問題の正規表現で出力は何ですか? – user961954

答えて

8

あなたは先読みであなたのパターンを入れて、それを行うことができます。

$string = "one two three four five"; 

$regex = '~\b(?=([^\s.]+(?:\s[^\s.]+){2}))~u'; 

preg_match_all($regex, $string, $matches); 

print_r($matches[1]); 
+0

これは素晴らしいです、ありがとう。文字クラスが '^ \ s'(スペース以外)にマッチしているにもかかわらず、ハイフンで分割しています。それをどうやって解決しますか? – atb

+1

@atb:単語境界 '\ b'を'(?<![^ \ s。]) '*(先行しない空白またはドットではない文字列)で置き換えることができます* –

2

explode()の方が使いやすいでしょう。

$string = "one two three four five"; 
$arr = explode(" ", $string); 

for ($i = 0; $i < 3; $i++) 
    echo $arr[$i], " ", $arr[$i + 1], " ", $arr[$i + 2], "\n"; 

出力:

0

あなたの配列に文字列を分割する必要があると思われます。

$string = "one two three four five"; 
    $stringSplit[] = $string.Split(' '); 
    $finalArray = []; 

次に、配列をループします。配列の各要素は、それに続く2つの要素と連結されます。

for(int I=0; I<$stringSplit.length - 3; I++){ 
     $secondString = I + 1; 
     $thirdString = I + 2; 
     $finalArray[I] = $stringSplit[I] + $stringSplit[$secondString] + $stringSplit[$thirdString]; 
} 
関連する問題