Javascript에서 괄호 사이에 문자열을 가져 오는 정규식


177

괄호 사이에있는 문자열을 반환하는 정규 표현식을 작성하려고합니다. 예를 들어 : 문자열 "("및 ")"사이에있는 문자열을 가져오고 싶습니다.

I expect five hundred dollars ($500).

돌아올 것이다

$500

Javascript에서 두 문자열 사이의 문자열을 얻는 정규식을 찾았습니다.

하지만 정규식을 처음 사용합니다. 정규식에서 '(', ')'를 사용하는 방법을 모르겠습니다



아래에서 go-oleg의 솔루션을 사용하여 달러 기호를 테스트하도록 약간 수정했습니다.var regExp = /\(\$([^)]+)\)/;
Dom Day

답변:


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]);

고장:

  • \( : 여는 괄호와 일치
  • ( : 그룹 캡처 시작
  • [^)]+: 하나 이상의 비 )문자 와 일치
  • ) : 엔드 캡처 그룹
  • \) : 닫는 괄호 일치

다음은 RegExplained 에 대한 시각적 설명입니다 .


12
+1 니스, 매력처럼 일했습니다. 시각적 설명을 위해이 tinyurl.com/mog7lr3 을 추가하고 싶습니다 .
Praveen

5
@ user1671639 : 업데이트되었습니다. 링크 주셔서 감사합니다!
go-oleg

5
캡처하려는 괄호 안에 괄호가 있으면 작동하지 않습니다. "나는 500 달러를 기대한다 (500 달러 (그러나 나는 그 돈을 다시는 볼 수 없다는 것을 안다)).
JayB

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
크롬 59.0.3071 오늘 그 jsperf 실행, 정규식은 더욱 빠르게하여 8 %
알렉스 맥밀란


8

간단한 솔루션

주의 사항 :이 솔루션은이 질문에서 문자열과 같이 단일 "("및 ")"만있는 문자열에 사용할 수 있습니다.

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

온라인 데모 (jsfiddle)


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) 일치하지만이 개 분리형으로 수 일치가 아니라 하나의 일치 항목으로 간주되는 것이 아니라? 미리 감사드립니다!
Tom Bird

(. +)가 내 요구 사항을 충족했습니다. "Dunhill (병 / 패킷 / 냄비 / 샷)"과 같은 물건을 캡처하고 "Dunhill"을 반환해야 함
GentleGiant

5

내부 괄호를 제외한 괄호 안의 하위 문자열을 일치시키기 위해 사용할 수 있습니다

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

무늬. 참조 정규식 데모 .

JavaScript에서는 다음과 같이 사용하십시오.

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

패턴 세부 사항

  • \(- (
  • ([^()]*)-캡처 그룹 1 : 및 이외의 0 개 이상의 문자 와 일치 하는 부정 문자 클래스()
  • \)- )숯.

전체 일치를 얻으려면 그룹 0 값을 잡고 괄호 안에 텍스트가 필요한 경우 그룹 1 값을 가져옵니다.

최신 자바 스크립트 코드 데모 (를 사용 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 유용한 답변으로 보이므로 새로운 matchAllJavaScript 코드 데모 도 추가했습니다 .
Wiktor Stribiżew

3

let str = "Before brackets (Inside brackets) After brackets".replace(/.*\(|\).*/g, '');
console.log(str) // Inside brackets


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.