中括弧の間の文字列を取得する正規表現


115

残念ながら、私は覚えている限り何年もの間、少なくとも年に1回は正規表現を学習しようとしましたが、あまり頻繁に使用しないので、いつも忘れてしまいます。今年の私の新年の決意は、正規表現をもう一度学習しないことです。つまり、今年は涙から私を救うために、スタックオーバーフローにあげます。(最後のクリスマスのリミックス)。

この形式{getThis}で文字列を渡し、文字列を返したいのですがgetThis。誰かが私の新年の抱負を守るのを手伝ってくれるでしょうか?


スタックオーバーフローに関する質問:


5
この質問は、「Advanced Regex-Fu」の下のStack Overflow Regular Expression FAQに追加されました。
aliteralmind 2014

@Kobi:FAQはwikiです。誰でも編集できます。だからそれを編集します。
aliteralmind 2014

回答:


44

文字列が常にその形式である場合、正規表現は過剰です。

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"

substring(1(ちょうど最初過去に1文字を起動するための手段{)と,g.length-1)(は含まない)までの文字列の長さマイナス1で文字を文字を取るための手段。これは、位置がゼロベース、つまりg.length-1最後の位置であるため機能します。

それは場合:オリジナルポスター以外の読者のために持っている正規表現、使用する/{([^}]*)}/あなたは、空の文字列を許可する場合、または/{([^}]+)}/あなたは、中括弧の間に少なくとも一つの文字がある場合にのみ一致させたい場合。壊す:

  • /:正規表現パターンを開始します
    • {:文字通りの波括弧
      • (:キャプチャを開始
        • [:キャプチャする文字のクラスの定義を開始します
          • ^}:「以外}
        • ]:OK、それがクラス全体の定義です
        • *:定義したクラスに一致する任意の数の文字
      • ):キャプチャが完了しました
    • }:文字通りの波括弧は、キャプチャしたものの直後に続く必要があります
  • /:正規表現パターンを終了します

7
部分文字列化は、作業する言語に基づいて変化するものの1つです。JavaScriptは停止するためにインデックスを取得し、PHPは目的の最終結果の長さを取得します(負の場合を除き、その場合、削除する文字数を取得します)。 、C#は再び異なります...素敵で混乱します。
jvenema

2
...そしてPythonにはスライスがあるだけで、IMOは他の何よりも優れています:p。
Grant Paul

27
甘いですが、それが正規表現かどうかはわかりません。おそらく彼は、正規表現を求めていた、と私は...悲しそう答えは質問とは何の関係もありません。..同じ答えのためにここに来た
baash05

5
@ baash05、質問全体を読んだ場合、OPは正規表現すら学習したくなかったので、それが示唆していたと思われる学術的な演習ではないと思います。
Kev

2
私がやってみたかった-1質問が求めているので、正規表現、私が探していた正規表現が、(質問は非常に自分自身を約束するように見えた一方で)受け入れ答えは私のために完全に役に立ちませんでした。最初のコメントを読んだ後、私がこの質問に最初に答えるなら、私は同じ/同様の方法で答えることができたであろうことを認めなければなりません...それで、結局、+ 1。
shadyyx

250

試す

/{(.*?)}/

つまり、{と}の間の任意の文字に一致しますが、貪欲にしないでください-}で終わる最短の文字列に一致します(?は貪欲になります)。括弧を使用すると、一致した部分を抽出できます。

別の方法は

/{([^}]*)}/

これは、}文字以外の任意の文字に一致します(貪欲にならない別の方法)


これは優れていますが、中括弧の組み合わせの数が異なる場合に一致させることは可能ですか?例:「{これは一致する必要があります}これは正しくありません{このような場合もあるはずです}したがって{オン}」?中括弧内にない値を取得したいのですが。また、中括弧は文では使用されず、スタックもありません(これは決して発生しません: "{some {text}}")。誰でもそれを行う方法を考えています:)?ありがとう!(ps:このソリューションに賛成)
Igor

4
中括弧の間のすべてをキャプチャするのではなく、中括弧と中括弧自体の間のすべてをキャプチャします。中かっこの中にあるものだけをキャプチャするにはどうすればいいですか?
Reality-Torrent 2016年

1
正規表現パーサーは数量詞ではないことを認識しているように見えるので、ここで中括弧をエスケープする必要がないのが好きです...まあ、私はこれをpythonで行っていますが、JavaScript正規表現はそのように動作すると想定していますあまりにも
drevicko 2016

3
g末尾にa を追加すると、グローバル検索になります。実際の例を
Benjamin

1
@ Reality-Torrentでは、gオプションを指定してすべての一致を取得すると、中括弧がキャプチャされていることもわかりました。Javaフラグのstring.matchの代わりにループでRegex.execを使用して、gフラグとキャプチャグループの両方を許可する必要があることがわかりました。参照developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
率直

150
/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter

@meouw sa = s.split( "/ \ {([^}] +)\} /"); コンパイルエラーが発生します。不正な繰り返し、無効なエスケープ文字。
likejudo 2012

@Anilは、正規表現ではなく文字列を分割引数として使用しているようです。あなたは何をしようとしているのですか?
meouw

30

これを試して:

/[^{\}]+(?=})/g

例えば

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

戻りますgskinner.comssd.sd


1
\}最初のブロックで使用する理由を説明できますか?
Uzair Ali 2018

1
いいですが}、で始まらない場合でも、で終わるすべてのグループに一致し{ます。
Ahmad Ibrahim

1
これが実際に機能する唯一の正解です。
pldg

説明:[^ \ {\}] +は中括弧以外のすべてと一致しますが、先読みアサーション(?=})は、中括弧の前のセクションのみを渡すようにします。/ ... / gを使用すると、最初のオカレンスだけでなく、すべてのオカレンスが取得されます。
0 -_- 0

19

これは、javascript replaceを使用した簡単な解決策です

var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"

上記の受け入れられた答えが示すように、元の問題は部分文字列で簡単に解決されますが、置換を使用すると、より複雑な使用例を解決できます

「randomstring999 [fieldname]」のような文字列がある場合、わずかに異なるパターンを使用してフィールド名を取得します

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"

15

これはTextmateで動作し、中括弧の間のCSSファイルのすべてに一致します。

\{(\s*?.*?)*?\}

selector {. . matches here including white space. . .}

さらにコンテンツを返すことができるようにしたい場合は、次のようにすべてを1つ以上のかっこで囲みます。

\{((\s*?.*?)*?)\}

そして$ 1経由でコンテンツにアクセスできます。

これは関数でも機能しますが、中括弧でテストしていません。


14

正規表現の先読みと後読みを使用したい。これは中括弧の中にあるものだけを与えます:

(?<=\{)(.*?)(?=\})

上記の波括弧をエスケープするバックスラッシュがあるはずです。彼らは私の提出物から取り除かれました。
Robert Cesaric 2010

1
おかげで、これは今日私を助けました。
ProfessionalAmateur

この方法の欠点はありますか?
Somatik

5
@Somatik —はい、負の先読みと後読みはECMAScriptではサポートされていません。
RobG 2014年

注:この例はJavaで動作します。すべての中括弧内のすべての値を返します。
マルチプレクサ

13

これを試して

let path = "/{id}/{name}/{age}";
const paramsPattern = /[^{\}]+(?=})/g;
let extractParams = path.match(paramsPattern);
console.log("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]

1
まさに私が欲しかったもの:)これはブレースなしで結果を返します、他のソリューションはそれと一緒に戻ります
Al-Mothafar

すばらしい、ここでの最良の答え。
michal.jakubeczy

4

中括弧が囲まれた文字列の配列を取得するための正規表現は、最初の出現を見つけるだけでなく、文字列で発生します。

 /\{([^}]+)\}/gm 

4

私は他の答えを調べましたが、重要な論理がそれらから欠落しているようです。つまり、2つのCONSECUTIVEブラケットの間のすべてを選択しますが、ブラケットは選択しません

だから、これが私の答えです

\{([^{}]+)\}

3
var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
    console.log(m[0].replace(re, '$1'));

.replace(/.*{(.*)}.*/, '$1')正規表現が一致しない場合、より単純な方が残念ながら文字列全体を返します。上記のコードスニペットは、一致をより簡単に検出できます。



2

この正規表現の再帰を使用して、{}(JSONテキストなどの)別のものも含めて、次の正規表現に一致させることができます。

\{([^()]|())*\}

いいですが、これはネストされた中括弧内のコンテンツのみをキャプチャします
Dominic

コンテンツに()が含まれている場合、キャプチャしません
Mert Mertce

1

これでも、誰かの問題を解決しようとしているときに私を助けます、

{}ようなパターンを持つ中括弧() 内でコンテンツを分割します{'day': 1, 'count': 100}

例えば:

#include <iostream> 
#include <regex> 
#include<string> 
using namespace std; 

int main() 
{ 
    //string to be searched
    string s = "{'day': 1, 'count': 100}, {'day': 2, 'count': 100}";

    // regex expression for pattern to be searched 
    regex e ("\\{[a-z':, 0-9]+\\}");
    regex_token_iterator<string::iterator> rend;

    regex_token_iterator<string::iterator> a ( s.begin(), s.end(), e );
    while (a!=rend) cout << " [" << *a++ << "]";
    cout << endl;

    return 0; 
}

出力:

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