2015-11-30 2 views
0

Итак, я знаю, как найти строку с указанной длиной и как найти строку с указанной буквой. Но как я могу найти строку, которая соответствует обоим условиям?
Например, я хочу найти строку из 4 букв, которая имеет букву «g».
Что я сделал:
\b[A-Za-z].[Gg][A-Za-z].\b
это регулярное выражение соответствует любому слову, имеющему букву «g». Так что теперь мне нужно ограничить длину, но когда я пытаюсь
\b([A-Za-z].[Gg][A-Za-z].){4}\b
он неКак найти строку с указанной длиной, которая указала букву?

+1

Возможный дубликат [как регулярное выражение соответствует строке с фиксированной длиной и по крайней мере цифрой в ней] (http://stackoverflow.com/questions/6991212/how-do-i-regex-match- a-string-with-fixed-length-and-at-less-a-digit-in-it) – naurel

+0

Считаете ли вы случаи, когда подстрока содержит только буквы ASCII? Если да, решение в SO-сообщении, предложенное naurel, не соответствует вашим требованиям. –

+0

Я, возможно, спешил с моим ответом. В предложении «azeGaze» он должен соответствовать: «azeG» и «zeGa» и «zGaz» и «Gaze»? Или нет, так как вы ищете слово (т. Е. Разделенное пробелами), просто «azeG» или просто «Gaze»? – naurel

ответ

0

Чтобы соответствовать только ASCII-буквенные последовательности с длиной 4, содержащего конкретное письмо, вы можете использовать

\b(?=\w*[Gg])[a-zA-Z]{4}\b 

ВИДЕТЬ regex demo

регулярное выражение гн akdown:

  • \b - граница слова (нам необходимо следующее письмо, чтобы быть символом слова: [a-zA-Z0-9_], но мы будем ограничивать его [a-zA-Z] с последующим рисунком потребляющего)
  • (?=\w*[Gg]) - положительный предпросмотр, что убеждается есть по крайней мере один g или G в слове (\w* соответствует 0 или более алфавитно-цифровых символов)
  • [a-zA-Z]{4} - 4 ASCII буквы
  • \b - конечные границы слова
+1

Спасибо! Я буду использовать слегка модифицированное регулярное выражение '\ b (? = [A-zA-Z] * [Gg]) [a-zA-Z] {4} \ b' –

+0

Кажется, что лучший способ проверить это в lookahead заключается в использовании принципа контраста. Я предпочел бы предложить '\ b (? = [A-fh-zA-FH-Z] * [Gg]) [a-zA-Z] {4} \ b'. Если вы можете использовать модификаторы, используйте '(? I) \ b (? = [A-FH-Z] * [G]) [AZ] {4} \ b' или'/\ b (? = [A-FH -Z] * [G]) [AZ] {4} \ b/i' (понятия не имею, так как вы не указали язык). –

0

Уже ответить here на @Alan Мур

Вы просто должны adapt:

(?<!\S)(?=[a-zA-Z]{4}(?!\S))\S*[gG]\S* 

(?<!\S) соответствует позиция, которой не предшествует символ без пробелов .

(?=[a-zA-Z]{4}(?!\S)) далее утверждает, что позиция , за которой следует ровно 4 буквы.

После того, как lookarounds удовлетворены, \S*[gG]\S* идет вперед и потребляет строка, принимать, по меньшей мере, один из символов г или G.

+0

Обратите внимание, что это решение может быть слишком «жадным» для требований OP, поскольку оно соответствует любым небездельным последовательностям указанной длины и имеет некоторый символ внутри. –

Смежные вопросы