Мне нужно установить регулярное выражение Java, которое распознает следующие 3 случая:

  1. Любая комбинация / количество следующих символов: «ACTGactg:»

Или

  1. Какие-нибудь вопросительные знаки "?"

Или

  1. Любая строка "NTC"

Я перечислю то, что я пробовал до сих пор, и ошибки, которые возникли.

public static final VALID_STRING = "[ACTGactg:]*";
// Matches the first case but not the second or third
// as expected.

public static final VALID_STRING = "\\?|[ACTGactg:]*";
// Matches all 3 conditions when my understanding leads me to
// believe that it should not except the third case of "NTC"

public static final VALID_STRING = "?|[ACTGactg:]*";
// Yields PatternSyntaxException dangling metacharacter ?

Я ожидаю, что будет точным следующее:

public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]*";

Но я хочу быть уверен, что если я уберу «NTC», любая строка «NTC» будет отображаться как недействительная.

Вот метод, который я использую для проверки этих регулярных выражений.

private static boolean isValid(String thisString){
    boolean valid = false;
    Pattern checkRegex = Pattern.compile(VALID_STRING);
    Matcher matchRegex = checkRegex.matcher(thisString);
    while (matchRegex.find()){
        if (matchRegex.group().length != 0){
            valid = true;
        }
    }
    return valid;
}

Итак, мои заключительные вопросы:

  1. Может ли "\\?" возможно, регулярное выражение действует как подстановочный знак, принимающий строку «NTC»?

  2. Операторы или "|" уместно здесь?

  3. Нужно ли использовать круглые скобки при использовании этих операторов или?

Вот несколько примеров входящих строк:

  • А: С
  • Т: G
  • AA: CC
  • Т: С: А: Г
  • NTC
  • ?

Спасибо

0
Malonge 12 Фев 2015 в 01:20

2 ответа

Лучший ответ

Да, предоставленное регулярное выражение будет в порядке:

public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]+";

...

boolean valid = str.matches(VALID_STRING);

Если вы удалите NTC| из регулярного выражения, строка NTC станет недействительной.

Вы можете протестировать его и поэкспериментировать самостоятельно здесь.

2
ntrp 11 Фев 2015 в 22:46

Поскольку вы используете метод Matcher.find(), вы ищете свой шаблон в любом месте строки.

Это означает, что строки A:C, T:G, AA:CC и т. Д. Совпадают полностью. Но как насчет NTC?

Это соответствует, потому что find() ищет совпадение где угодно. часть TC совпадает, поэтому вы получаете true.

Если вы хотите сопоставить только строки полностью, либо используйте метод match(), либо используйте ^ и $.

Обратите внимание, что вам не нужно проверять, что совпадение длиннее 0, если вы измените свой шаблон на [ACTGactg:]+ вместо [ACTGactg:]*.

2
RealSkeptic 11 Фев 2015 в 22:44