У Regex тоже есть определенные буквы и хотя бы одна из определенной группы букв - PullRequest
1 голос
/ 01 июня 2011

Может ли кто-нибудь помочь мне с утверждением регулярного выражения для нахождения утверждения с использованием этого правила?

Слово должно иметь буквы «J, U, G» (только буквы, а не порядок) и хотя бы одну из этих букв: G, L, E, R, S

Так что я могу искать в списке кувшины, жонглеры, жонглеры, жонглирование и т. Д.

Спасибо

Ответы [ 3 ]

2 голосов
/ 01 июня 2011

Существует также решение регулярных выражений.Но вы должны действительно дать язык, который используете, потому что могут быть и другие, возможно, лучшие решения для вашей задачи, как писал @Quick Джо Смит.

^(?=.*J)(?=.*U)(?=.*G)(?=.*[LERS]).*$

См. На Рубулярном

Эти (?=) - позитивные взгляды, они проверяют, есть ли символ в строке, но не соответствуют им..* в конце будет соответствовать вашей полной строке.

Вам также понадобится модификатор i, чтобы включить игнорирование (без учета регистра)

0 голосов
/ 03 июня 2011

Если вы работаете с одним словом за раз, попробуйте следующее:

boolean isMatch = s.matches(
  "(?i)^(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4");

Если вы ищете совпадения в более длинной строке:

Pattern p = Pattern.compile(
    "(?i)\\b(?:J()|U()|G(?!.*G)()|[GLERS]()|\\w){4,}+\\b\\1\\2\\3\\4");
Matcher m = p.matcher(s);
while (m.find()) {
    String foundString = m.group();
} 

Каждый разодна из первых четырех альтернатив - J(), U(), G() или [GLERS]() - соответствует чему-либо, пустая группа, следующая за ней, ничего не «захватывает» (т. е. пустая строка).Когда достигается конец строки, каждая из обратных ссылок - \1, \2 и т. Д. - пытается сопоставить то же самое, что и соответствующая ей группа: снова ничего.

Очевидно, что это всегда будет успешным;Вы всегда можете соответствовать, отмечая.Хитрость в том, что обратная ссылка не будет даже пытаться соответствовать, если соответствующая группа не участвовала в матче.То есть, если в целевой строке нет j, () в альтернативе J() никогда не включается.Когда механизм регулярных выражений обрабатывает обратную ссылку \1 позже, он немедленно сообщает об ошибке, потому что знает, что группа не участвовала в матче.

Таким образом, пустые группы действуют как флажки, иОбратные ссылки убедитесь, что все флажки были отмечены.Хотя есть одна морщина.Обе альтернативы G() и [GLERS]() могут соответствовать g;как убедиться, что они оба участвуют в матче, когда они вам нужны?Первое регулярное выражение, которое я попробовал,

"(?i)^(?:J()|U()|G()|[GLERS]()|\\w){4,}+$\\1\\2\\3\\4"

... не соответствовало слову "jugg", потому что альтернатива G() потребляла оба g;[GLERS]() никогда не было возможности принять участие.Поэтому я добавил отрицательный прогноз - (?!.*G) - и теперь он соответствует только last g.Если бы у меня было три варианта, которые могли бы соответствовать g, мне пришлось бы добавить (?!.*G.*G) к первому и (?!.*G) ко второму.Но в действительности я, вероятно, перешел бы на другой подход (возможно, не включающий регулярные выражения) задолго до того, как я достиг этой точки.;)

0 голосов
/ 01 июня 2011

Первая часть вашего вопроса совсем не годится для регулярных выражений.Шаблон закончится запутанным беспорядком, и он будет только ухудшаться, если вы добавите больше необходимых символов.

Вторая часть, однако, тривиальна:

m/[glers]/i

Поэтому я бы предложил реализоватьРешение в двух частях.Это зависит от вашего языка:

C # (с использованием Linq)

var chars = "GJU"; // characters are sorted.
if (inputstring.ToUpper().Intersect(chars).OrderBy(c => c).SequenceEqual(chars)) {
    // do stuff if match.
}

Perl (требуется 5.10)

my @chars = sort split '', 'GJU'; # Transform into sorted array.
my %input = map{($_, 1)} split '', uc $inputstring; # stores unique chars from string.
if (@chars ~~ %input) { # Smart match performs hash key intersection.
    # Do stuff in here.
}

Python

chars = set('jug')
input = set(inputstring)
if chars == (chars & input):
    # do something here
...