import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "# Host entry:\n"
+ "# Start of line followed by optional horizontal spaces,\n"
+ "# The word \"Host\" case-insensitive, followed by anything (captured) and a new line.\n"
+ "^[\\t ]*host[\\t ]+(.+?)[\\t ]*\\n\n"
+ "# A configuration line or comment, multiple times:\n"
+ "(?:\n"
+ " # Negative lookahead to avoid matching a new \"Host\" entry, but\n"
+ " # also with optional comment lines before it.\n"
+ " (?!(?:^[\\t ]*\\#.*\\n)*[\\t ]*host\\b)\n"
+ " # Optional horizontal spaces.\n"
+ " [\\t ]*\n"
+ " # Config line, comment or empty line (done with the ? at the end).\n"
+ " (?:\n"
+ " # A) A config line, capturing it (with space or equal sign).\n"
+ " (\\w+)\\b(?:[\\t ]*=[\\t ]*|[\\t ]+)(.*) |\n"
+ " # B) Or a comment.\n"
+ " \\#.*\n"
+ " )?\n"
+ " # New line or end of the config file.\n"
+ " (?:\\n|\\Z)\n"
+ ")+";
final String string = "Host test \n"
+ " Hostname test.domain.com\n"
+ " User james\n"
+ " Port 22\n"
+ " # Comment\n"
+ " IdentityFile ~/.ssh/key.pub\n\n"
+ "# With 2 aliases\n"
+ "Host test2 test-2\n"
+ " Hostname test2.domain.com\n"
+ " User = james\n"
+ " Port=22\n"
+ " # Port 23\n"
+ " IdentityFile = ~/.ssh/key2.pub\n\n"
+ "# For all hosts except test2, activate compression and set log level:\n"
+ "Host * !test2\n"
+ " Compression yes\n"
+ " LogLevel INFO\n\n"
+ " IdentityFile ~/.ssh/id_rsa\n\n"
+ "Host *.sweet.home\n"
+ " Hostname 192.168.2.17\n"
+ " User tom\n"
+ " IdentityFile \"~/.ssh/id tom.pub\" # If has spaces, then quote it.\n\n"
+ "# With a lot of spaces between lines\n"
+ "Host localhost\n\n"
+ " Hostname 127.0.0.*\n\n"
+ " IdentityFile ~/.ssh/id_rsa\n\n"
+ "# Without empty lines between Host definitions:\n"
+ "Host dummy\n"
+ " Hostname ssh.dummy.com\n"
+ " User user\n"
+ "Host dummy2\n"
+ " Hostname ssh.dummy2.com\n"
+ " User user";
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.COMMENTS);
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