次の状況を満たすのに役立つ正規表現は次のとおりです。
if (string starts with a letter (one or more))
it must be followed by a . or _ (not both)
else
no match
例(テストされている、一致する値のリストがあると想像してください):
public static boolean matches(String k) {
for (final String key : protectedKeys) {
final String OPTIONAL_SEPARATOR = "[\\._]?";
final String OPTIONAL_CHARACTERS = "(?:[a-zA-Z]+)?";
final String OR = "|";
final String SEPARATED = OPTIONAL_CHARACTERS +
OPTIONAL_SEPARATOR + key + OPTIONAL_SEPARATOR
+ OPTIONAL_CHARACTERS;
String pattern = "(" + key + OR + SEPARATED + ")";
if (k.matches(pattern)) {
return true;
}
}
return false;
}
このコードは以下のすべてに一致します
System.out.println(matches("usr"));
System.out.println(matches("_usr"));
System.out.println(matches("system_usr"));
System.out.println(matches(".usr"));
System.out.println(matches("system.usr"));
System.out.println(matches("usr_"));
System.out.println(matches("usr_system"));
System.out.println(matches("usr."));
System.out.println(matches("usr.system"));
System.out.println(matches("_usr_"));
System.out.println(matches("system_usr_production"));
System.out.println(matches(".usr."));
System.out.println(matches("system.usr.production"));
しかし、失敗します
System.out.println(matches("weirdusr")); // matches when it should not
単純化して、私はそれを認識したいです
final String a = "(?:[a-zA-Z]+)[\\._]" + key;
final String b = "^[\\._]?" + key;
文字列が文字で始まる場合、セパレーターはオプションではなくなりました。それ以外の場合、文字列がセパレーターで始まる場合、オプションになりました