2012-03-06 1 views
3

を含まない文字列のグループを一致させる方法:私は例えば「__」文字列(2つのアンダースコア)</p> <p>を境界として持つ文字列のグループを一致させる必要があり、いくつかのサブ

hello __1the_re__ my name is __pe er33__ 

「1the_re」と「PE er33は、」私の問題は

/__((?!__).*)__/ 
を「の文字列が含まれていない文字列」を定義され

を一致させる必要があります

Iveはこれを試しましたが、動作していません...

ありがとう!

答えて

3

あなたは近いです:

/__((?!__).)*__/ 

作品。星は反復グループの外になければなりません。先読みは、先頭の__の直後ではなく、すべての位置で実行されます。

これは(私はあなたが二重のアンダースコアとの間でコンテンツをキャプチャしたいことを推測している)右のテキストをキャプチャしていないので、あなたはおそらく、あなたが非貪欲マークを使用することができ

/__((?:(?!__).)*)__/ 
+0

nice!今、私は正規表現で何が間違っていたのか理解しています、ありがとう! – skyline26

0

をしたいです: "?"あなたのグループ内

/__((?!__).*?)__/g 
// javascript: 
>>> "hello __1the_re__ my name is __pe er33__".match(/__((?!__).*?)__/g) 
["__1the_re__", "__pe er33__"] 
+3

それはあまり意味がありません - あなたは定量器を怠惰にすると、先読みアサーションは必要ありません。 –

1

、次のいずれかと一致するようにしたい:

  1. ない_任意の文字が続く任意の文字を。
  2. 任意の文字ではない_

正規表現:最初の最初の試合として

/__(.[^_]|[^_])*__/ 

、それは続きます。よりよい試合抽出のため、非キャプチャフラグを追加して、内側に一致する:

/__((?:.[^_]|[^_])*)__/ 

例:

$subject = 'hello __1the_re__ my name is __pe er33__'; 
$pattern = '/__((?:.[^_]|[^_])*)__/'; 
$r = preg_match_all($pattern, $subject, $match); 
print_r($match[1]); 

出力:

Array 
(
    [0] => 1the_re 
    [1] => pe er33 
) 

しかし、明らかにそれを作るためだけの方がはるかに簡単です定量化遅延型:

/__(.+?)__/ 
関連する問題