角括弧の間のテキストを抽出する正規表現


411

単純な正規表現の質問。次の形式の文字列があります。

this is a [sample] string with [some] special words. [another one]

角かっこ内の単語を抽出するための正規表現は何ですか。

sample
some
another one

注:私の使用例では、ブラケットはネストできません。

回答:


766

次の正規表現をグローバルに使用できます。

\[(.*?)\]

説明:

  • \[[はメタ文字であり、文字どおりに一致させたい場合はエスケープする必要があります。
  • (.*?) :貪欲ではない方法ですべてを照合し、キャプチャします。
  • \]]はメタ文字であり、文字どおりに一致させたい場合はエスケープする必要があります。

9
もう1つの回答の方法は、[^]]貪欲でない(?)よりも高速に使用でき、貪欲でないことをサポートしない正規表現フレーバーでも機能します。ただし、貪欲でない方が見栄えが良くなります。
Ipsquiggle 2010年

184
[ ]出力(結果)から除外する方法は?
ミッキーティン

9
@ MickeyTin、Javaを使用している場合は、group()を介してgroup(1)を使用してグループ化できるため、 '[]'は一緒になりません
abyteneverlie

21
この試合唯一の最初の出現
hfatahi

9
かっこを返品からどのように除外しますか?
jzadra

119
(?<=\[).+?(?=\])

ブラケットなしでコンテンツをキャプチャします

  • (?<=\[) -前向きな後読み [

  • .*? -コンテンツの貪欲でない一致

  • (?=\]) -前向きな先読み ]

編集:ネストされたブラケットの場合、以下の正規表現が機能するはずです:

(\[(?:\[??[^\[]*?\]))

3
@igaurav私はそれをチェックし、それは動作します。ただし、JavaScriptなどの後読みをサポートしていない環境では機能しません。多分それはあなたのケースですか?
AdamMoszczyński、2015

Adam、ネストされたブラケットソリューションは、中に文字列があると失敗.します...
patrick

89

これは大丈夫です:

\[([^]]+)\]

5
私の使用例では、括弧で囲まれたテキストに改行が含まれる場合があり、この正規表現は機能しますが、受け入れられた回答は機能しません。
デイブ

1
文字クラス[^]]はどういう意味ですか?それは何と一致しますか?
Richard

3
@ Richard、^は文字クラスを否定します。「]以外の任意の文字」を意味します。
jasonbar 2013

8
私はそれが期待どおりに機能しないと思います、あなたは\[([^\[\]]*)\]最も内側のブラケットのコンテンツを取得するために使うべきです。あなたに見ればlfjlksd [ded[ee]22]、その後\[([^]]+)\]、あなたを取得する[ded[ee]提案式が返すだろうが[ee]リンクされた
TMC

1
この正規表現を使用してテキストを抽出するための「sed」および「awk」の例を提供してください。ありがとう。
バレット2015

32

ブラケットはネストできますか?

そうでない場合:\[([^]]+)\]角括弧を含む1つのアイテムと一致します。後方参照\1には、一致するアイテムが含まれます。正規表現フレーバーがルックアラウンドをサポートしている場合は、

(?<=\[)[^]]+(?=\])

これは、括弧内のアイテムにのみ一致します。


@KunalMukherjee:いいえ、正規表現は何度でも一致できます。ただし、一部の正規表現フレーバーは、正規表現を繰り返し適用するように明示的に指示する必要があります(たとえば、/gJavaScriptでフラグを使用することにより)。
Tim Pietzcker 2017

14

大括弧を一致に含めたくない場合は、以下が正規表現です。 (?<=\[).*?(?=\])

分解してみましょう

.、行末記号を除くすべての文字に一致します。これ?=前向きな先読みです。正の先読みは、特定の文字列が後に来るときに文字列を見つけます。?<=ある正の後読み。肯定的な後読みは、特定の文字列の前にある文字列を見つけます。これを引用すると

ポジティブな先読み(?=)

式Bが続く式Aを見つけます。

A(?=B)

ポジティブの後ろを見る(?<=)

式Bが先行する式Aを見つけます。

(?<=B)A

オルタナティブ

正規表現エンジンが先読みと後読みをサポートしていない場合は、正規表現\[(.*?)\]を使用してグループ内の大括弧の内部をキャプチャし、必要に応じてグループを操作できます。

この正規表現はどのように機能しますか?

括弧はグループ内の文字をキャプチャします。.*?(あなたが持っていない限り行ターミネータを除き、括弧の間のすべての文字を取得sフラグが有効になって)貪欲ではない方法で。


12

(?<=\[).*?(?=\])上記の説明に従って正常に動作します。Pythonの例を次に示します。

import re 
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')"
re.search('(?<=\[).*?(?=\])', str).group()
"'formPagination_bottom',2,'Page',true,'1',null,'2013'"

1
正規表現は、どこにあるかにかかわらず、常にコード形式を使用する必要があります。正規表現がコードブロックではなくテキスト内にある場合は、バッククォートを使用してそれらをフォーマットできます。(参照
アランムーア

1
また、問題は括弧[]ではなく角括弧()に関するものでした。
アランムーア

6

万が一、不均衡な括弧があったかもしれませんが、次のような再帰を使用して式を設計できます。

\[(([^\]\[]+)|(?R))*+\]

もちろん、使用している言語やRegExエンジンに関連しています。

RegExデモ1


それ以外、

\[([^\]\[\r\n]*)\]

RegExデモ2

または、

(?<=\[)[^\]\[\r\n]*(?=\])

RegExデモ3

探索するのに適したオプションです。


式を簡略化/変更/探索する場合は、regex101.comの右上のパネルで説明されています。必要に応じて、このリンクで、サンプル入力とどのように一致するかを確認することもできます。


RegEx回路

jex.imは正規表現を視覚化します。

ここに画像の説明を入力してください

テスト

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

ソース

バランスのとれた括弧に一致する正規表現


4

角かっこa〜zの間の小さなアルファベットのみを入力する場合

(\[[a-z]*\])

小さくて大文字が必要な場合はa-zA-Z

(\[[a-zA-Z]*\]) 

スモールキャップと数字a-zA-Z0-9が必要な場合

(\[[a-zA-Z0-9]*\]) 

角かっこの間のすべてが必要な場合

テキスト、数字、記号が必要な場合

(\[.*\])

3
([[][a-z \s]+[]])

上記は次の説明があればうまくいくはずです

  • 角かっこ内の文字[]は、文字クラスを定義します。これは、パターンが角かっこ内で言及された少なくとも1つの文字と一致する必要があることを意味します

  • \ sはスペースを指定します

  •  +は、前述の文字の少なくとも1つを+に意味します。


敏感なケースでA-Zは、パターンに追加する必要があります:([[][a-zA-Z \s]+[]]); \ 文字列マーク( "と ')で定義する正規表現パターンで、"または'の使用法でバックスラッシュ処理によって初心者を混合しながら、それは良い方法だと思います!
MohaMad 2017年

C ++正規表現で私のために機能した唯一の答え(括弧の代わりに引用符でそれを行うことを除いて)。std::regex pattern{R"(["][a-zA-Z \s]+["])"};
StackAttack 2018年

3

このコードは、角括弧と括弧の間のコンテンツを抽出します

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))

(?: non capturing group
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses
| or
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets

3

Rでは、次のことを試してください。

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"

..またはgsub(pat, "\\1", x, perl=TRUE)、指定しpatた正規表現は..
Karsten W.

0

改行と括弧を含める必要がありました

\[[\s\S]+\]


0

部分文字列と一致するようにとの最初 [最後に ]、あなたが使用することができます

\[.*\]            # Including open/close brackets
\[(.*)\]          # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\])   # Excluding open/close brackets (using lookarounds)

正規表現のデモ正規表現のデモ#2を参照してください。

次の式を使用して最も近い角括弧の間の文字列を照合します

  • ブラケットを含む:

    • \[[^][]*]-PCRE、Python re/regex、.NET、Golang、POSIX(grepを、セッド、bashの)
    • \[[^\][]*]-ECMAScript(JavaScript、C ++ std::regex、VBA RegExp
    • \[[^\]\[]*] -Java正規表現
    • \[[^\]\[]*\] -Onigmo(Ruby、どこにでもブラケットをエスケープする必要があります)
  • 括弧を除く:

    • (?<=\[)[^][]*(?=])- PCRE、パイソンre/ regex、.NET(C#の、等)、ICU(R stringr)、JGSoftソフトウェア
    • \[([^][]*)]- バッシュGolang - キャプチャ下記参照も、エスケープ括弧一対の角括弧の間の内容を
    • \[([^\][]*)]- JavaScriptのC ++std::regexVBARegExp
    • (?<=\[)[^\]\[]*(?=]) -Java正規表現
    • (?<=\[)[^\]\[]*(?=\]) -Onigmo(Ruby、どこにでもブラケットをエスケープする必要があります)

*0個以上の文字に一致します。+文字に一致します。結果のリスト/配列で空の文字列が一致しないようにするには、1個以上の一致します。

両方のルックアラウンドサポートが利用可能な場合は常に、上記のソリューションはそれらに依存して、先頭/末尾の開閉ブラケットを除外します。それ以外の場合は、キャプチャグループに依存します(一部の言語の最も一般的なソリューションへのリンクが提供されています)。

ネストされた括弧を照合する必要がある場合は、正規表現で解決策を見てバランスのとれた括弧のスレッドを照合し、丸括弧を角括弧に置き換えて必要な機能を得ることができます。開閉ブラケットを除いたコンテンツにアクセスするには、キャプチャグループを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.