By Rueta

2010-05-13 03:46:30 8 Comments

I'm using jQuery. I have a string with a block of special characters (begin and end). I want get the text from that special characters block. I used a regular expression object for in-string finding. But how can I tell jQuery to find multiple results when have two special character or more?


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

and my JavaScript code:

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


  //end write js 

My result is: [|cơ thử|nghiệm|] thị trường [|test2|đây là test lần 2|] chứng khoán [|Mỹ|day la nuoc my|] . But this isn't the result I want :(. How to get [text] for times 1 and [demo] for times 2 ?

I've just done my work after searching info on internet ^^. I make code like this:

var filterdata = takedata.match(/(\[.*?\])/g);
  • my result is : [|cơ thử|nghiệm|],[|test2|đây là test lần 2|] this is right!. but I don't really understand this. Can you answer my why?


@Asaph 2010-05-13 03:50:26

The non-greedy regex modifiers are like their greedy counter-parts but with a ? immediately following them:

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

@Hashbrown 2013-10-04 04:46:27

might be useful to note that ? on its own means 'one or zero' (but is greedy!). E.g. 'bb'.replace(/b?/, 'a') //'ab' and 'bb'.replace(/c?/, 'a') //'abb'

@Muhammad Umer 2019-05-26 06:03:21

how did c match nothing there

@Noctis 2020-02-19 05:40:38

@MuhammadUmer I think he was suggesting that because the c won't match, but you have the ?, which is 0 or 1, then it's going to match 0 number of c characters, hence replacing it. I have no idea how it works though, because that doesn't compile in any regex engine i've tried 😢

@iangraham 2010-05-13 03:52:15

I believe it would be like this


the g at the end means global, so it doesn't stop at the first match.

@Rueta 2010-05-13 04:00:20

yea, you are right in /g. i've just done my work with your answer /g ^^. But when i make regular /(\[.+\])/g my result is : [|cơ thử|nghiệm|] thị trường [|test2|đây là test lần 2|] chứng khoán [|Mỹ|day la nuoc my|] :(

@polygenelubricants 2010-05-13 04:00:12

You are right that greediness is an issue:


If you want to match both A--Z, you'd have to use A.*?Z (the ? makes the * "reluctant", or lazy).

There are sometimes better ways to do this, though, e.g.


This uses negated character class and possessive quantifier, to reduce backtracking, and is likely to be more efficient.

In your case, the regex would be:


Unfortunately Javascript regex doesn't support possessive quantifier, so you'd just have to do with:


See also

Quick summary

*   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

Note that the reluctant and possessive quantifiers are also applicable to the finite repetition {n,m} constructs.

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

@Rueta 2010-05-13 04:08:23

i copy your regex into my work and result is : invalid quantifier +\]) [Break on this error] var filterdata = takedata.match(/(\[[^\]]++\])/);\n (firebugs + Firefox) something wrong ?

@polygenelubricants 2010-05-13 04:19:13

@Rueta: apparently Javascript flavor doesn't support possessive. I've edited my answer to reflect this fact. You can just use one + instead of two.

@Roland Pihlakas 2015-02-27 01:01:54

Though atomic groups can be used in place of possessive quantifiers, JavaScript does not support the atomic groups either. But there is a third alternative, see this:… - you can emulate atomic grouping with LookAhead. (?>a) becomes (?=(a))\1

@Roshambo 2017-07-10 02:10:50

This is a Java answer for a JavaScript question and Java != JavaScript. Readers, take note.

Related Questions

Sponsored Content

96 Answered Questions

[SOLVED] How can I remove a specific item from an array?

  • 2011-04-23 22:17:18
  • Walker
  • 6824861 View
  • 8406 Score
  • 96 Answer
  • Tags:   javascript arrays

95 Answered Questions

[SOLVED] How to validate an email address in JavaScript

86 Answered Questions

[SOLVED] How do JavaScript closures work?

58 Answered Questions

[SOLVED] How do I redirect to another webpage?

73 Answered Questions

31 Answered Questions

[SOLVED] Regular expression to match a line that doesn't contain a word

15 Answered Questions

[SOLVED] What is a non-capturing group in regular expressions?

3 Answered Questions

57 Answered Questions

[SOLVED] How do I check if an element is hidden in jQuery?

20 Answered Questions

[SOLVED] How do you use a variable in a regular expression?

  • 2009-01-30 00:11:05
  • JC Grubbs
  • 777065 View
  • 1397 Score
  • 20 Answer
  • Tags:   javascript regex

Sponsored Content