Регулярные выражения тоже содержат определенные буквы и, по крайней мере, одну из определенной группы букв

#java #regex #search #letter

#java #регулярное выражение #Поиск #буква

Вопрос:

Может ли кто-нибудь помочь мне с инструкцией regex для поиска инструкции, использующей это правило?

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

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

Спасибо

Комментарии:

1. Но в вашем примере lugger нет всех J , U и G

2. Не имеет смысла. в чем разница между needs to have и, по крайней мере, одной из? И почему G в обоих?

3. …ваш отредактированный пост включает gurgle , который также не включает J , U и G

Ответ №1:

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

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

Смотрите на Rubular

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

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

Ответ №2:

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

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

 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 amp; input):
    # do something here
  

Ответ №3:

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

 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) — и теперь он соответствует только последнему g . Если бы у меня было три альтернативы, которые могли бы соответствовать a g , мне пришлось бы добавить (?!.*G.*G) к первой и (?!.*G) ко второй. Но реально, я, вероятно, переключился бы на другой подход (вероятно, тот, который не включает регулярные выражения) задолго до того, как достиг этой точки. 😉