// 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);
}
}