2010-05-13 52 views
153

我正在使用jQuery。我有一個特殊字符塊(開始和結束)的字符串。我想從特殊字符塊中獲取文本。我使用正則表達式對象進行字符串查找。但是,如何讓jQuery在有兩個特殊字符或多個特殊字符時查找多個結果?如何使正則表達式變爲非貪婪?

我的HTML:

<div id="container"> 
    <div id="textcontainer"> 
    Cuộc chiến pháp lý giữa [|cơ thử|nghiệm|] thị trường [|test2|đây là test lần 2|] chứng khoán [|Mỹ|day la nuoc my|] và ngân hàng đầu tư quyền lực nhất Phố Wall mới chỉ bắt đầu. 
    </div> 
</div> 

和我的JavaScript代碼:

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

    alert(filterdata); 

    //end write js 
}); 

我的結果是:[|公司星期四|nghiệm|] THI張庭[|測試2 |đâyLà測試LAN 2 |]chứngkhoán[|Mỹ| day la nuoc我|]。但是,這不是我想要的結果:(如何獲得【正文】對於次1和[演示]爲次2?


我剛剛完成我的工作,互聯網上搜索信息後^^我讓這樣的代碼:

var filterdata = takedata.match(/(\[.*?\])/g); 
  • 我的結果是:[|公司星期四|nghiệm|],[| TEST2 |đâyLà測試LAN 2 |] 這是對的!但我不太明白這個,你能回答我的原因嗎?

回答

334

非貪婪正則表達式修飾符是像他們的貪婪反部分,但與?立即跟了上去:

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

可能需要注意的是有用的''它自己的方式 '的一個或零'?(但貪婪!)。例如。 ''bb'.replace(/ b?/,'a')//'ab''和''bb'.replace(/ c?/,'a')//'abb'' – Hashbrown 2013-10-04 04:46:27

+2

哇,我沒有理念。這很酷! – vaughan 2016-12-08 20:24:11

3

我相信這會是這樣

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

g末意味着全球化,所以它不會在第一場比賽中停止。

+0

是的,你是正確的/ g。我剛剛用你的答案/ g ^^完成了我的工作。 但是,當我定期/(\\[..+\\])/g我的結果是: [|cơthử|nghiệm|]thịtrường[| test2 |đàylàtestlần2 |]chứngkhoán[| | Mỹ| day la nuoc我的|] :( – Rueta 2010-05-13 04:00:20

28

你是正確的,貪婪是一個問題:

--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}構造。在Java中

例子:

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

我複製你的正則表達式到我的工作中,結果是: 無效量詞+ \\]) [break on this error] var filterdata = takedata.match(/(\\ [[[^\\]] ++ \\])/); \ n(螢火蟲+火狐) 出錯了? – Rueta 2010-05-13 04:08:23

+0

@Rueta:顯然Javascript風格不支持所有格。我編輯了我的答案以反映這一事實。你可以使用一個'+'而不是兩個。 – polygenelubricants 2010-05-13 04:19:13

+1

儘管可以使用原子組代替佔有量詞,但JavaScript不支持原子組。但還有第三種選擇,請參閱:http://instanceof.me/post/52245507631/regex-emulate-atomic-grouping-with-lookahead - '您可以使用LookAhead模擬原子分組。 (?> a)變成(?=(a))\ 1' – 2015-02-27 01:01:54