import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "\\((?:[^()]++|(?R))*\\)";
final String string = "SELECT Name AS [Object Name], Switch([Type]=5,'Query',[Type]=-32768,'Form',[Type]=6,'Table') AS [Object Type], Switch([Type]=5,1,[Type]=-32768,2,[Type] In (1,4,6),6) AS [Object Type ID], Left(Name,4) as Prefix, LTrim(RTrim(Mid([Name],5,30))) as Suffix\n\n"
+ "SELECT \"Amy's code is righteous.\", left(\"abc\",1), right('source code',4), \"Bill's code has been righteous too.\"\n\n"
+ "----------\n\n"
+ "End goal is to replace all commas in SQL SELECT clause with comma+linefeed but ignore commas inside parenthesis (which may be nested).\n\n"
+ "\\((?:[^()]++|(?R))*\\)\n\n"
+ "This expression will find all of the nested parentheis using recursion. I want to do one of these two options:\n"
+ " a) Replace all commas in the matched groups with the pipe \"|\" character, \n"
+ " then with two simple StrReplace() calls: replace all commas with comma+linefeed, then replace all | with comma.\n"
+ "OR\n"
+ " b) Select all text that is not in the matched group and replace commas with comma+linefeed.\n\n"
+ "I'm using AutoHotkey and the RegExReplace() function.";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Java, please visit: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html