Solved

Regular Expression on string with braces in Java

Posted on 2009-05-12
3
1,098 Views
Last Modified: 2013-12-17
Hi guys,

I hope you could help me with these.  I need a regular expression that could split up the string below

{adfsadfd}{sdads}{asdf{asdf}{asdf}}{asdfsdf{dads}}

into

{adfsadfd}
{sdads}
{asdf{asdf}{asdf}}
{asdfsdf{dads}}



Currently I have "\\{([.*]*)[^}]*}"   but it doesn't work. It will also include the groups inside, which i don't want


Thanks in advance
0
Comment
Question by:xanbi
3 Comments
 
LVL 84

Accepted Solution

by:
ozo earned 500 total points
ID: 24371754
([{](?:[^{]|[{][^{}]*})*})
0
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24375825
I would suggest that for recursive grammars, regular expressions are not usually adequate. You can usually write a "good enough" solution, but it will not be bulletproof for the whole grammar. There is a limit to how you can employ lookahead and lookbehind in a non-recursive approach, which regular expressions are.

Recursive descent parsers can be written for special cases, and I have provided a sample that will not descend into the nested {} as you asked. In a real parser we would usually return tree nodes and parse until there is no nesting left, but since you want the nesting to be preserved past 1 level, here is a sample that works, maybe you can use it.

// Simple recursive descent parser for matching nested tokens

public class Main {

	  public static void main(String [] args) {

	       String s = "{adfsadfd}{sdads}{asdf{asdf}{asdf}}{asdfsdf{dads}}";

	       String token;

	       int beginIndex = 0;

	       while((token = match(s.substring(beginIndex))) != null) {

	    	   System.out.println(token);

	    	   beginIndex += token.length();

	       }

	   }
 

	   public static String match(String s) {

	      int i = 0; char ch;

	      if(s == null || s.length() == 0)

	    	  return null;

	      String token = "";

	      if((ch =s.charAt(i++)) != '{') // not a valid start pattern

	    	  return null;

	      token += ch;

	      while(i < s.length()) {

	    	  ch = s.charAt(i);

	    	  if(ch == '}') { // end of top level {} pattern

	    		  token += ch;

	    		  return token;

	    	  }

	    	  else if(ch != '{') { // non bracket, add to the token

	    		  token += ch;

	    		  i++;

	    	  }

	    	  else { // nested {, so recursively match and concat sub-strings

	    		  String subtoken = match(s.substring(i));

	    		  if(subtoken != null) {

	    			  token += subtoken;

	    			  i += subtoken.length();

	    		  }

	    	  }

	      }

	      

	      return token;

	   }

}

Open in new window

0
 

Author Closing Comment

by:xanbi
ID: 31580846
Thank you very much.  I accepted ozo solution because I should use regular expression prior to making scan through the string.

Regards
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Today companies are subjected to more-and-more data, and it won't stop any time soon.  But there are obvious opportunities for reducing data, particularly data duplicated among companies.
I use more than 1 computer in my office for various reasons. Multiple keyboards and mice take up more than just extra space, they make working a little more complicated. Using one mouse and keyboard for all of my computers makes life easier. This co…
This video demonstrates basic masking and how to edit the mask to reveal the desired image.
The viewer will learn how to successfully create a multiboot device using the SARDU utility on Windows 7. Start the SARDU utility: Change the image directory to wherever you store your ISOs, this will prevent you from having 2 copies of an ISO wit…

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now