Я прочитал документацию и различные учебники онлайн, но я все еще запутался в том, как регулярное выражение работает на Java. То, что я пытаюсь сделать, это создать функцию, которая принимает аргумент типа string. Затем я хочу проверить, содержит ли переданная строка любые символы, кроме MDCLXVIivxlcdm. Так, например, строка «XMLVID» должна возвращать false, а «ABXMLVA» должна возвращать значение true.
public boolean checkString(String arg) { Pattern p = Pattern.complile("[a-zA-z]&&[^MDCLXVIivxlcdm]"); Matcher m = p.matcher(arg); if(m.matches()) return true; else return false; }
Когда я передаю «XMLIVD», «ABXMLVA» и «XMLABCIX», все возвращают false. Что я делаю не так? Любая помощь будет оценена.
Вам нужно будет использовать оператор пересечения символьного classа Java внутри classа символов, иначе он буквально соответствует &&
. Btw, ваш первый class символов от A
до (нижний регистр) z
также включает в себя [\]^_
, чего вы, разумеется, не хотите; и вы ошибочно написали «Patter.complile».
Кроме того, matches()
Попытка сопоставить весь регион с шаблоном.
Таким образом, вам либо нужно использовать find()
вместо, либо подставить выражение с помощью .*
.
public boolean checkString(String arg) { return Pattern.compile("[[a-zA-Z]&&[^MDCLXVIivxlcdm]]").matcher(arg).find(); }
вы можете использовать такую функцию, с двумя аргументами, а именно:
origingalString
исходная строка для проверки searchString
строка для поиска код точно,
public boolean checkCompletelyExist(String origingalString,String searchString){ boolean found = false; String regex = ""; try{ for(int i = 0; i < searchString.length();i++){ String temp = String.valueOf(searchString.charAt(i)); regex = "[\\x20-\\x7E]*"+"["+temp.toLowerCase()+"|"+temp.toUpperCase()+"]+[\\x20-\\x7E]*"; if(!origingalString.matches(regex)){ found = true; break; } } System.out.println("other character present : "+found); } catch (Exception e) { e.printStackTrace(); } return found; }
например:
checkCompletelyExist("MDCLXVIivxlcdm","XMLVID")
будет other character present : false
а также
checkCompletelyExist("MDCLXVIivxlcdm","ABXMLVA")
будет other character present : true
Регулярные выражения (RegEx / RegExp) В основном регулярное выражение представляет собой шаблон, описывающий определенное количество текста.
^abc$ start / end of the string \b \B word, not-word boundary \w \d \s word, digit, whitespace \W \D \S not word, digit, whitespace \z - End of entire string (…) - Grouping (capture groups) [abc] any of a, b, or c [^abc] not a, b, or c [ag] character between a & g { m,n } - quantifiers for “from m to n repetitions” + - quantifiers for 1 or more repetitions (ie, {1,}) ? - quantifiers for 0 or 1 repetitions (ie, {0,1})
POSIX Bracket Expressions
скобок POSIX Bracket Expressions
скобок POSIX – это особый тип classов символов. Выражения скобок POSIX соответствуют одному символу из набора символов, как и обычные classы символов. Имена classов символов POSIX должны быть записаны в нижнем регистре. Стандарт POSIX определяет 12 classов символов. В приведенной ниже таблице перечислены все 12, плюс classы [:ascii:]
и [:word:]
которые также поддерживаются некоторыми вариантами регулярных выражений.
Согласование шаблонов с регулярными выражениями:
final Pattern mix_alphaNumaric_pattern = Pattern.compile("^[A-Za-z0-9]+$"); final Pattern alphabets_pattern = Pattern.compile("^[A-Za-z,\\- ]+$"); final Pattern alphabetsNull_pattern = Pattern.compile("|^[A-Za-z,\\- ]+$"); final Pattern numaric_pattern = Pattern.compile("^[0-9]+$"); // ^begning +followed By $end final Pattern date_time_pattern = Pattern.compile("\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}\\:\\d{1,2}"); final Pattern weather_pattern = Pattern.compile("[\\-]*\\d{1,3}\\.\\d{1,6}"); final Pattern email_pattern = Pattern.compile("^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]+[\\w]$"); final Pattern mobile_pattern = Pattern.compile("(\\+)?(\\d{1,2})?\\d{10}"); public static void main(String[] args) { String[] str = {"MCDL", "XMLIVD", "ABXMLVA", "XMLABCIX"}; Pattern p = Pattern.compile("^(M|D|C|L|X|V|I|i|v|x|l|c|d|m)+$"); // Returns: true if, and only if, the entire region sequence matches this matcher's pattern for (String sequence : str ) { boolean match = false, find = false; if ( !p.matcher(sequence).matches() ) match = true; if (p.matcher(sequence).find()) find = true; System.out.format("%s \t Match[%s] Find[%s]\n", sequence, match, find); } }
Вывод:
MCDL Match[false] Find[true] XMLIVD Match[false] Find[true] ABXMLVA Match[true] Find[false] XMLABCIX Match[true] Find[false]
@see это ссылки на: