1

次の状況を満たすのに役立つ正規表現は次のとおりです。

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;

文字列が文字で始まる場合、セパレーターはオプションではなくなりました。それ以外の場合、文字列がセパレーターで始まる場合、オプションになりました

4

3 に答える 3

0

これが誰かに役立つなら、私もこれを機能させました

    for (final String key : protectedKeys) {

        final String separator = "[\\._]";
        final String textSeparator = "(" + "^(?:[a-zA-Z]+)" + separator + ")";
        final String separatorText = "(?:" + separator + "(?:[a-zA-Z]+)$" + ")";

        final String OR = "|";

        final String azWithSeparator = textSeparator + "?" + key + separatorText + "?";
        final String optionalSeparatorWithoutAZ = separator + "?" + key + separator + "?";

        String pattern = "(" + key + OR + azWithSeparator + OR + optionalSeparatorWithoutAZ + ")";

        if (k.matches(pattern)) {
            return true;
        }
    }
于 2012-06-04T22:23:20.107 に答える
0
if (string starts with a letter (one or more))
  it must be followed by a . or _ (not both)
else
  no match

次のように正規表現で記述できます。

^[A-Za-z]+[._]

正規表現は仕様に合わせて作成されています (何に従うことが許可されているかについては何も言いません)。

条件が満たされない場合、一致は定義ごとに失敗するためelse、強制的な失敗による変更は必要ありません(?!)

于 2012-06-05T14:44:03.147 に答える
0

上記の条件を満たすには、次のことを試してください。

srt.matches("[a-zA-Z]+(\\.[^_]?|_[^\\.]?)[^\\._]*")
于 2012-06-04T21:56:26.937 に答える