욕심없는 정규 표현을하는 방법?

jQuery를 사용하고 있습니다. 특수 문자 (시작과 끝) 블록이있는 문자열이 있습니다. 해당 특수 문자 블록에서 텍스트를 가져오고 싶습니다. 문자열 내 찾기에 정규식 객체를 사용했습니다. 그러나 두 개의 특수 문자 이상이있을 때 여러 결과를 찾도록 jQuery에 어떻게 말할 수 있습니까?

내 HTML :

<div id="container">
    <div id="textcontainer">
     Cuc chiến pháp lý gia [|cơ thử|nghim|] th trường [|test2|đây là test ln 2|] chng khoán [|Mỹ|day la nuoc my|] và ngân hàng đầu tư quyn lc nht Ph Wall mi ch bt đầu.
    </div>
</div>

내 JavaScript 코드 :

$(document).ready(function() {
  var takedata = $("#textcontainer").text();
  var test = 'abcd adddb';
  var filterdata = takedata.match(/(\[.+\])/);

  alert(filterdata);

  //end write js 
});

내 결과는 다음과 같습니다. [| cơ thử | nghiệm |] thờ trường [| test2 | đây là test lần 2 |] chứng khoán [| Mỹ | day la nuoc my |] . 그러나 이것은 내가 원하는 결과가 아닙니다.


인터넷에서 정보를 검색 한 후 방금 작업했습니다 ^^. 나는 다음과 같은 코드를 만든다 :

var filterdata = takedata.match(/(\[.*?\])/g);
  • 내 결과는 : [| cơ thử | nghiệm |], [| test2 | đây là test lần 2 |]
    맞습니다!. 그러나 나는 이것을 정말로 이해하지 못한다. 왜 그런지 대답 할 수 있습니까?


답변

욕심없는 정규 표현식 수정자는 욕심 많은 대응 자와 비슷하지만 ?즉시 따라옵니다.

*  - zero or more
*? - zero or more (non-greedy)
+  - one or more
+? - one or more (non-greedy)
?  - zero or one
?? - zero or one (non-greedy)


답변

당신은 욕심이 문제라는 것이 옳습니다.

--A--Z--A--Z--
  ^^^^^^^^^^
     A.*Z

당신이 모두 일치 할 경우 A--Z, 당신은 사용해야 할 거라고 A.*?Z합니다 (이 ?차종 *“싫어”, 또는 게으른).

그러나 때로는 더 좋은 방법이 있습니다.

A[^Z]*+Z

이것은 부정 문자 클래스와 소유 수량자를 사용하여 역 추적을 줄이고 더 효율적일 수 있습니다.

귀하의 경우 정규식은 다음과 같습니다.

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

불행히도 Javascript 정규식은 소유 수량자를 지원하지 않으므로 다음과 관련이 있습니다.

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

또한보십시오


빠른 요약

*   Zero or more, greedy
*?  Zero or more, reluctant
*+  Zero or more, possessive

+   One or more, greedy
+?  One or more, reluctant
++  One or more, possessive

?   Zero or one, greedy
??  Zero or one, reluctant
?+  Zero or one, possessive

주저하고 소유 한 정량자는 유한 반복 {n,m}구성 에도 적용 할 수 있습니다.

자바 예제 :

System.out.println("aAoZbAoZc".replaceAll("A.*Z", "!"));  // prints "a!c"
System.out.println("aAoZbAoZc".replaceAll("A.*?Z", "!")); // prints "a!b!c"

System.out.println("xxxxxx".replaceAll("x{3,5}", "Y"));  // prints "Yx"
System.out.println("xxxxxx".replaceAll("x{3,5}?", "Y")); // prints "YY"


답변

나는 이것이 이렇게 될 것이라고 믿습니다.

takedata.match(/(\[.+\])/g);

g는 첫 경기에서 중지되지 않도록 끝은 글로벌을 의미합니다.


답변