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


227

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 |] 맞습니다!. 그러나 나는 이것을 정말로 이해하지 못한다. 왜 그런지 대답 할 수 있습니까?

답변:


492

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

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

29
노트에 유용 할 수 있음을 ?자신의 수단 '0'또는 '에 (하지만 욕심!)입니다. 예 'bb'.replace(/b?/, 'a') //'ab''bb'.replace(/c?/, 'a') //'abb'
Hashbrown

1
c는 어떻게 거기에 맞지
않았는가

1
나는 그가이 때문에 것을 건의했다 생각 @MuhammadUmer c일치하지 않습니다,하지만 당신은이 ?,되는 0 or 1, 일치 것 0 number of c characters, 따라서 그것을 대체. 나는 그것이 시도한 정규식 엔진에서 컴파일되지 않기 때문에 그것이 어떻게 작동하는지 전혀 모른다. 😢
Noctis

35

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

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

정규식을 내 작업에 복사하면 결과는 유효하지 않습니다 (잘못된 수량 자 + \]) [이 오류 발생] var filterdata = takedata.match (/ (\ [[^ \]] ++ \]) /); \ n ( firebugs + Firefox) 문제가 있습니까?
Rueta

@Rueta : 분명히 Javascript 맛은 소유를 지원하지 않습니다. 이 사실을 반영하기 위해 답변을 편집했습니다. 둘 +대신에 하나만 사용할 수 있습니다 .
polygenelubricants 4

1
소유 그룹 화자 대신 원자 그룹을 사용할 수 있지만 JavaScript는 원자 그룹도 지원하지 않습니다. : 그러나 세 번째 대안이이 참조 instanceof.me/post/52245507631/...을 -you can emulate atomic grouping with LookAhead. (?>a) becomes (?=(a))\1
롤랜드 Pihlakas

2
이것은 JavaScript 질문에 대한 Java 답변이고 Java! = JavaScript입니다. 독자 여러분, 주목하십시오.
Roshambo

3

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

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

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


네, 당신은 / g에 있습니다. 방금 답변 / g ^^으로 작업을 완료했습니다. 그러나 내가 정기적으로 /(\[.+\])/g를 만들면 결과는 다음과 같습니다. [| cơ thử | nghiệm |] thị trường [| test2 | đây là test lần 2 |] chứng khoán [| Mỹ | day la nuoc my |] :(
Rueta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.