// Uncolored, plain source file:  deriv3.java
//    deriv3.java by Steven R. Brandt
//    <p>
//    An example file explaining how to use
//    com.stevesoft.pat, com.stevesoft.pat.wrap,
//    and com.stevesoft.pat.apps
//    <p>
//    This software comes without express or implied warranty.
//    No claim is made about the suitability of this software for
//    any purpose and neither I nor SteveSoft shall be liable for
//    damages suffered by the user of this software.
import com.stevesoft.pat.*;

// This is the new rule we wish to define...
// In this case, balanced grouping symbols.
// Thus, "({})" will match, and so will "[}".
class Bal extends Validator {
  public int validate(StringLike src,int start,int end) {
     // You really shouldn't put print statements here except when
     // debugging.  I'm doing it, however, so you can see what things
     // validate has to process in the search for a match.
     System.out.println("validating: >>"+src.substring(0,start)+"|"+
       src.substring(start,end)+"|"+src.substring(end,src.length())+"<<");
     int count = 0;
     int m = src.length();
     if(m > end)
       m = end;
     for(int i=start;i<m;i++) {
       char c = src.charAt(i);
       if(c=='('||c=='{'||c=='[')
         count++;
       else if(c==')'||c=='}'||c==']') {
         count--;
         // We return a match with a different
         // end position than the variable "end".
         if(count==0)
           return i+1;
       } else if(c=='\\')
         i++;
     }
     return count==0 ? end : -1;
  }
}

public class deriv3 {
  public static void main(String[] args) {

    Regex.define(
      "bal", // name of our new pattern
      "[([{].*?[\\])}]", // A standard Regex that our pattern must satisfy
      new Bal()); // Validator for our pattern

    // The second argument to Regex is the replacement rule,
    // and, as is conventional, $& expands to the matched portion
    // of the pattern.
    Regex r = new Regex("(??bal)"," *$&* ");

    // Substitute for valid matches in a test String.
    String p = r.replaceAll("(hello) {goodbye{world}} (what?[) [see-ya!]");

    System.out.println(p);
  }
}