区切り文字を除外しながら2つの文字の間に含まれる文字列を検索する正規表現


294

文字列から、区切り文字自体を返さずに、2つの区切り文字の間に含まれる文字のセットを抽出する必要があります。

簡単な例が役立つはずです。

ターゲット:角括弧自体を返さずに、角括弧の間の部分文字列を抽出します。

ベース文字列This is a test string [more or less]

次のレジストリを使用すると、例。

\ [。*?\]

試合は[more or less]です。取得する必要があるのはmore or less(角括弧なし)だけです。

できますか?


回答:


453

簡単に完了:

(?<=\[)(.*?)(?=\])

技術的には、先読みと後読みを使用しています。先読みと後読みゼロ幅アサーションを参照してください。パターンは以下で構成されます:

  • キャプチャされない(後読み)[が前に付きます。
  • 貪欲ではない捕獲されたグループ。最初に停止するのは貪欲ではありません]; そして
  • キャプチャされない(先読み)]が後に続きます。

または、角括弧の間にあるものをキャプチャすることもできます。

\[(.*?)\]

マッチ全体ではなく、最初にキャプチャされたグループを返します。


138
「簡単にできます」、笑!:)正規表現はいつも頭痛の種ですが、問題を解決するものを見つけたらすぐに忘れてしまいがちです。ソリューションについて:1つ目は期待どおりに機能し、2つ目は機能せず、ブラケットを含め続けます。私はC#を使用していますが、RegExオブジェクトには正規表現エンジンの独自の「フレーバー」がある可能性があります...
Diego

5
これは、最初に一致したグループではなく、一致全体を表示しているためです。
cletus 2009

本当にありがとう、とても便利なウェブサイト!参考にしていきます。:)混乱した場合は申し訳ありませんが、C#の開発は私のスキルの1つではありません
Diego

1
サブストリングにも区切り文字が含まれている場合、これは機能しますか?たとえば、This is a test string [more [or] less]これで戻りmore [or] lessますか?
gnzlbg 2013

1
@gnzlbgいいえ、「more [or」を返します
MerickOWA

52

使用している場合は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"

2
文字列に[多かれ少なかれ]一致するものが複数ある場合はどうなりますか?


19

ブラケット間のビットを「キャプチャ」する必要があるだけです。

\[(.*?)\]

キャプチャするには、括弧で囲みます。これがどの言語を使用しているかは言いません。たとえばPerlでは、$ 1変数を使用してこれにアクセスします。

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

他の言語ではメカニズムが異なります。たとえば、C#はMatchコレクションクラスを使用していると思います。


おかげで、このソリューションは機能しませんでした。角かっこを含め続けます。Cletusのソリューションに対するコメントで書いたように、C#RegExオブジェクトがそれを異なる方法で解釈している可能性があります。私はC#の専門家ではないので、それは単なる推測であり、おそらく私の知識の欠如にすぎません。:)
ディエゴ

11

[^\[] [以外の任意の文字に一致します。

+一致しないものを1つ以上一致させ[ます。これらの一致のグループを作成します。

(?=\])肯定的な先読み]]結果に含めないで終わるグループに一致します。

できました。

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

証明。

http://regexr.com/3gobr

nullによって提案されたソリューションに似ています。ただし、追加\]は必要ありません。追加の注意点として、表示されます\エスケープする必要はありません[後に^。読みやすくするために残しておきます。

区切り文字が同じである状況では機能しません。"more or less"例えば。


8

PHP:

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);


3

bashスクリプトで正規表現を使用すると、同じ問題が発生しました。私はパイプを使用して2ステップソリューションを使用し、grep -oを適用しました

 '\[(.*?)\]'  

まず

'\b.*\b'

他の答えでは明らかに効率的ではありませんが、代替案です。


3

これは特にJavaScriptの正規表現パーサーで機能します /[^[\]]+(?=])/g

これをコンソールで実行するだけです

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;

2

/と#の間の文字列を検索したかったのですが、#がオプションの場合があります。これが私が使う正規表現です:

  (?<=\/)([^#]+)(?=#*)

0

これは、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

-1

大括弧なしでテキストを抽出する必要がある場合は、bash awkを使用できます

echo " [hola mundo] " | awk -F'[][]' '{print $2}'

結果:

hola mundo

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