#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)
ко второй. Но реально, я, вероятно, переключился бы на другой подход (вероятно, тот, который не включает регулярные выражения) задолго до того, как достиг этой точки. 😉