import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "\\[\\ (RUNNING|STOPPED)\\ \\]\n"
+ "(.+?)\n"
+ "(?:\\[Pid:\\ (\\d+)\\]|$)";
final String string = "\n\n"
+ "I want to extract the words between the two bracket \"blocks\" and also the word in first brackets (RUNNING or STOPPED).\n\n"
+ "Example (extract the bolded part):\n\n"
+ "[ RUNNING ] My First Application [Pid: 4194]\n\n"
+ "[ RUNNING ] Second app (some data) [Pid: 5248]\n\n"
+ "[ STOPPED ] Logger App\n\n"
+ "So, as you can see, the [Pid: X] part is optional. I can write the regex as follows:\n\n"
+ "\\[\\s+(RUNNING|STOPPED)\\s+\\]\\s+([^\\[]+).*\n\n"
+ "and it will work. But this would fail if App name would contain the '[' character. I tried the following, but it won't work:\n\n"
+ "\\[\\s+(RUNNING|STOPPED)\\s+\\]\\s+(?!\\[Pid)+.*\n\n"
+ "My idea was to match any words/characters that are not starting with \"[Pid\", but I guess this would match any words that are not followed by \"[Pid\".\n\n"
+ "Is there any way to do exactly that: Match any word that is not \"[Pid\", i.e. match the part until first appearing of \"[Pid\" substring?\n";
final Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS | 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