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?

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

and my JavaScript code:

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

  alert(filterdata); 

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

3 comments

@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

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

I believe it would be like this

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

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:

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

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.

A[^Z]*+Z

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: instanceof.me/post/52245507631/… - 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

89 Answered Questions

[SOLVED] How do I remove a particular element from an array in JavaScript?

  • 2011-04-23 22:17:18
  • Walker
  • 6158052 View
  • 7682 Score
  • 89 Answer
  • Tags:   javascript arrays

56 Answered Questions

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

88 Answered Questions

[SOLVED] How to validate an email address in JavaScript

19 Answered Questions

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

  • 2009-01-30 00:11:05
  • JC Grubbs
  • 686186 View
  • 1256 Score
  • 19 Answer
  • Tags:   javascript regex

86 Answered Questions

[SOLVED] How do JavaScript closures work?

3 Answered Questions

73 Answered Questions

29 Answered Questions

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

58 Answered Questions

[SOLVED] How do I redirect to another webpage?

15 Answered Questions

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

Sponsored Content