[javascript] 중괄호 사이에 문자열을 가져 오는 정규식

불행히도, 내가 기억할 수있는 한 수년 동안 적어도 일년에 한 번 정규식을 배우려고 했음에도 불구하고 나는 그것을 자주 사용하지 않기 때문에 항상 잊어 버립니다. 올해 내 새해 결심은 정규식을 다시 배우지 않는 것입니다. 그래서 올해는 눈물에서 나를 구하기 위해 Stack Overflow에 줄 것 입니다. (마지막 크리스마스 리믹스).

이 형식의 문자열을 전달하고 문자열을 {getThis}반환하고 싶습니다 getThis. 새해 결심을 지키는 데 도움을 줄 사람이 있습니까?


Stack Overflow에 대한 관련 질문 :



답변

문자열이 항상 해당 형식이면 정규식은 과잉입니다.

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

substring(1수단 (단지 첫번째 과거에 한 문자를 시작합니다 {)과 ,g.length-1)수단은 문자열 길이를 뺀 하나의 문자 (하지만 제외)까지 문자를 취할 수 있습니다. 이것은 위치가 0부터 시작하기 때문에 작동합니다 g.length-1. 즉 , 마지막 위치입니다.

원래 포스터가 아닌 독자의 경우 :이 경우 정규식 사용으로 /{([^}]*)}/당신이 빈 문자열을 허용 할 경우, 또는 /{([^}]+)}/중괄호 사이에 적어도 하나 개의 문자가있는 경우에만 일치합니다. 고장:

  • /: 정규식 패턴 시작
    • {: 리터럴 중괄호
      • (: 캡처 시작
        • [: 캡처 할 캐릭터 클래스 정의 시작
          • ^}: “다른 것 }
        • ]: 좋습니다. 이것이 우리의 전체 클래스 정의입니다.
        • *: 방금 정의한 해당 클래스와 일치하는 문자 수
      • ): 캡처 완료
    • }: 리터럴 중괄호는 캡처 한 내용 바로 뒤에 와야합니다.
  • /: 정규식 패턴 종료

답변

시험

/{(.*?)}/

즉, {와} 사이의 모든 문자와 일치하되 욕심 내지 마십시오.}로 끝나는 가장 짧은 문자열과 일치합니다 (?는 욕심을 멈 춥니 다.). 괄호를 사용하면 일치하는 부분을 추출 할 수 있습니다.

또 다른 방법은

/{([^}]*)}/

} 문자를 제외한 모든 문자와 일치합니다 (욕심을 내지 않는 또 다른 방법).


답변

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

/        - 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


답변

이 시도:

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

예를 들면

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

반환합니다 gskinner.com, ssd.sd.


답변

다음은 javascript replace를 사용하는 간단한 솔루션입니다.

var st = '{getThis}';

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

위의 대답에서 지적했듯이 원래 문제는 부분 문자열로 쉽게 해결되지만 replace를 사용하면 더 복잡한 사용 사례를 해결할 수 있습니다.

“randomstring999 [fieldname]”과 같은 문자열이있는 경우 약간 다른 패턴을 사용하여 fieldname을 가져옵니다.

var nameAttr = "randomstring999[fieldname]";

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


답변

이것은 Textmate에서 작동하며 중괄호 사이에있는 CSS 파일의 모든 항목과 일치합니다.

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


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

콘텐츠를 추가로 반환하려면 다음과 같이 하나 이상의 괄호로 모두 래핑합니다.

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

$ 1를 통해 콘텐츠에 액세스 할 수 있습니다.

이것은 함수에서도 작동하지만 중첩 중괄호로 테스트하지 않았습니다.


답변

regex lookahead 및 lookbehind를 사용하려고합니다. 이것은 중괄호 안에있는 것만 제공합니다.

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