回答:
簡単に完了:
(?<=\[)(.*?)(?=\])
技術的には、先読みと後読みを使用しています。先読みと後読みゼロ幅アサーションを参照してください。パターンは以下で構成されます:
または、角括弧の間にあるものをキャプチャすることもできます。
\[(.*?)\]
マッチ全体ではなく、最初にキャプチャされたグループを返します。
This is a test string [more [or] less]
これで戻りmore [or] less
ますか?
使用している場合はJavaScriptを、第一溶液 cletusにより提供し、(?<=\[)(.*?)(?=\])
JavaScriptが後読み演算子をサポートしていないため、動作しません。
ただし、2番目のソリューションはうまく機能しますが、2番目に一致する要素を取得する必要があります。
例:
var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);
戻ります:
["[more or less]", "more or less"]
したがって、必要なのは2番目の値です。使用する:
var matched = regex.exec(strToMatch)[1];
返品するには:
"more or less"
ブラケット間のビットを「キャプチャ」する必要があるだけです。
\[(.*?)\]
キャプチャするには、括弧で囲みます。これがどの言語を使用しているかは言いません。たとえばPerlでは、$ 1変数を使用してこれにアクセスします。
my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";
他の言語ではメカニズムが異なります。たとえば、C#はMatchコレクションクラスを使用していると思います。
[^\[]
[以外の任意の文字に一致します。
+
一致しないものを1つ以上一致させ[
ます。これらの一致のグループを作成します。
(?=\])
肯定的な先読み]
。]
結果に含めないで終わるグループに一致します。
できました。
[^\[]+(?=\])
証明。
nullによって提案されたソリューションに似ています。ただし、追加\]
は必要ありません。追加の注意点として、表示されます\
エスケープする必要はありません[
後に^
。読みやすくするために残しておきます。
区切り文字が同じである状況では機能しません。"more or less"
例えば。
/と#の間の文字列を検索したかったのですが、#がオプションの場合があります。これが私が使う正規表現です:
(?<=\/)([^#]+)(?=#*)
これは、C#で「[」と「]」なしで取得した方法です。
var text = "This is a test string [more or less]";
//Getting only string between '[' and ']'
Regex regex = new Regex(@"\[(.+?)\]");
var matchGroups = regex.Matches(text);
for (int i = 0; i < matchGroups.Count; i++)
{
Console.WriteLine(matchGroups[i].Groups[1]);
}
出力は次のとおりです。
more or less