import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(?:\n"
+ " (?<!\\S)@ # Match \"@\" only if it's not preceded by a non-whitespace character\n"
+ " | # OR\n"
+ " (?:\n"
+ " # Telegram link types reference: https://core.telegram.org/api/links\n"
+ " #\n"
+ " (?:https?://)? # Optional HTTP or HTTPS protocol\n"
+ " (?:www\\.)? # www subdomain\n"
+ " (?:t\\.me|telegram\\.(?:me|dog)) # Match \"t.me\", \"telegram.me\", or \"telegram.dog\" domains\n"
+ " / # Ensure a forward slash after the domain\n"
+ " | # OR\n"
+ " tg://resolve\\?domain= # Match Telegram deep link schema (tg://resolve?domain=)\n"
+ " )\n"
+ " | # OR\n"
+ " (?=\\b # Positive lookahead: Ensure a valid subdomain before username\n"
+ " (?!\\w*__) # Disallow double underscores anywhere in the username\n"
+ " (?!\\w*_{2,}) # Disallow underscores at the start or end of username\n"
+ " (?:[a-z][a-z0-9_]{3,31}) # Username\n"
+ " (?<!_) # Disallow usernames ending with an underscore\n"
+ " \\.t\\.me$ # Ensure it ends with \".t.me\"\n"
+ " )\n"
+ ")\n"
+ "(?P<username> # Start capturing the username\n"
+ " (?!\\w*_{2,}) # Disallow double underscores in the username\n"
+ " (?!\\w*[^0-9a-z_.,\\s]) # Ensure valid characters (letters, numbers, underscores, dots, commas, spaces)\n"
+ " (?:[a-z][a-z0-9_]{3,31}) # Username\n"
+ " (?<!_) # Disallow username ending with an underscore\n"
+ " \\b # Ensure it's a valid word boundary\n"
+ ")\n"
+ "(?:\\.t\\.me)? # Optional \".t.me\" subdomain";
final String string = "@username\n"
+ "@user_name\n"
+ "@username123\n"
+ "@alanbadoev @orkester okinea.t.me\n"
+ "@username123_, @username123\n"
+ "@username123, @username123_\n"
+ "@username123, username123.t.me\n"
+ "@name_with_underscore\n"
+ "@user$name\n"
+ "@user__name\n"
+ "@username_\n"
+ "@user name\n"
+ "@toolongusernameeeeeeeeeeeeeeeeeee\n"
+ "@123username\n"
+ "https://t.me/username\n"
+ "https://www.t.me/username\n"
+ "http://t.me/username\n"
+ "t.me/username\n"
+ "tg://resolve?domain=username\n"
+ "username.t.me\n"
+ " username.t.me\n"
+ "https://t.me/@username\n"
+ "http://t.me/user__name\n"
+ "username_.t.me\n"
+ "user__name.t.me\n";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE | 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