Javascriptで括弧内の文字列を取得する正規表現


177

括弧の間にある文字列を返す正規表現を書こうとしています。例:文字列「(」と「)」の間にある文字列を取得したい

I expect five hundred dollars ($500).

戻るだろう

$500

Javascriptで2つの文字列間の文字列を取得する正規表現が見つかりました

しかし、私は正規表現に不慣れです。正規表現で「(」、「)」を使用する方法がわかりません



:あなたは少しドル記号のためのテストに変更し、下に行く-オレグのソリューションを使用することができますvar regExp = /\(\$([^)]+)\)/;
ドム日

回答:


460

エスケープされた(を使用した\)括弧のセット(括弧と一致)と、キャプチャグループを作成する通常の括弧のグループを作成する必要があります。

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

壊す:

  • \( :左括弧と一致
  • ( :グループのキャプチャを開始
  • [^)]+:1つ以上の非)文字に一致
  • ) :キャプチャグループの終了
  • \) :閉じ括弧と一致

RegExplainedの視覚的な説明は次のとおりです


12
+1いいですね。視覚的な説明のために、このtinyurl.com/mog7lr3を追加してください。
Praveen 2013

5
@ user1671639:更新されました。リンクをありがとう!
go-oleg 2013

5
キャプチャする括弧内に括弧がある場合、これは機能しません。例:「500ドル(500ドル(ただし、そのお金が二度と見られないことはわかっています))を期待しています。」
JayB

1
この正規表現は、文字列ごとに1つのインスタンスに一致する場合にのみ機能します。グローバル/gフラグを使用すると、期待どおりに機能しません。
silkAdmin

2
以下のように括弧内に複数の文字列がある場合の解決策は何ですか。
Mohamad Al Asmar

33

文字列操作を試してください:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

または正規表現(上記と比較して少し遅い

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}

7
そのjsperfをChrome 59.0.3071で実行すると、正規表現は8%高速になりました
Alex McMillan



5

通貨記号の後の数字のみの場合:機能する\(.+\s*\d+\s*\)はずです

または\(.+\)括弧内のものについて


2
これはサンプルテキストで機能します)が、文字列の後半に別のものが表示された場合I expect five hundred dollars ($500). (but I'm going to pay).、貪欲さが+より多くキャプチャされます。
Ro Yo Mi

@Denomalesでは、これらの文字列の両方のインスタンスをどのようにキャプチャしますか。理想的には私は似たようなことをしていますが($500)、したいのですが: (but I'm going to pay) 一致しますが、1つの一致するアイテムと見なされるのではなく、2つの個別の一致ですか?前もって感謝します!
トム・バード

(。+)私の要件のために働いた。「Dunhill(Bottle / Packet / Pot / Shot)」のようなものをキャプチャし、「Dunhill」だけを返す必要がありました
GentleGiant

5

使用できる内側の括弧を除いて、括弧内の部分文字列を照合するには

\(([^()]*)\)

パターン。参照してください。正規表現のデモを

JavaScriptでは、次のように使用します

var rx = /\(([^()]*)\)/g;

パターンの詳細

  • \(- (イワナ
  • ([^()]*)-キャプチャグループ1:and 以外の0以上の文字に一致する否定された文字クラス()
  • \)- )イワナ。

完全一致を取得するには、グループ0の値を取得します。括弧内のテキストが必要な場合は、グループ1の値を取得します。

最新のJavaScriptコードのデモ(を使用matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

従来のJavaScriptコードのデモ(ES5準拠):


この正規表現は()、並んでいる場合でもペアとそのコンテンツのみをキャプチャするため、優れてい()()ます。
limitlessloop

1
@limitlessloopこれは役立つ回答のように思われるので、新しいmatchAllベースのJavaScriptコードのデモも追加しました。
WiktorStribiżew


2

代替:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
 (2) ["$500", "$1"]

必要に応じて、角括弧を角括弧または中括弧に置き換えることができます


1
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

$で始まり、その後に ')'が続く最初の数値と一致します。')'は試合の一部にはなりません。コードは最初の一致でアラートを出します。

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

このコードは、すべての一致でアラートを出します。

参照:

「?= n」を検索 http://www.w3schools.com/jsref/jsref_obj_regexp.asp

「x(?= y)」を検索 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

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