Мне нужно установить регулярное выражение Java, которое распознает следующие 3 случая:
- Любая комбинация / количество следующих символов: «ACTGactg:»
Или
- Какие-нибудь вопросительные знаки "?"
Или
- Любая строка "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;
}
Итак, мои заключительные вопросы:
Может ли "\\?" возможно, регулярное выражение действует как подстановочный знак, принимающий строку «NTC»?
Операторы или "|" уместно здесь?
Нужно ли использовать круглые скобки при использовании этих операторов или?
Вот несколько примеров входящих строк:
- А: С
- Т: G
- AA: CC
- Т: С: А: Г
- NTC
- ?
Спасибо
2 ответа
Да, предоставленное регулярное выражение будет в порядке:
public static final VALID_STRING = "NTC|\\?|[ACTGacgt:]+";
...
boolean valid = str.matches(VALID_STRING);
Если вы удалите NTC|
из регулярного выражения, строка NTC станет недействительной.
Вы можете протестировать его и поэкспериментировать самостоятельно здесь.
Поскольку вы используете метод Matcher.find()
, вы ищете свой шаблон в любом месте строки.
Это означает, что строки A:C
, T:G
, AA:CC
и т. Д. Совпадают полностью. Но как насчет NTC
?
Это соответствует, потому что find()
ищет совпадение где угодно. часть TC
совпадает, поэтому вы получаете true
.
Если вы хотите сопоставить только строки полностью, либо используйте метод match()
, либо используйте ^
и $
.
Обратите внимание, что вам не нужно проверять, что совпадение длиннее 0, если вы измените свой шаблон на [ACTGactg:]+
вместо [ACTGactg:]*
.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.