regex - проверка символов в диапазоне строк - PullRequest
2 голосов
/ 03 июля 2019

Я пытаюсь найти символы в строке, но только в пределах диапазона самой строки поиска.

Например, допустим, мне нужно искать символ 'o' в;

the quick fox jumped over the lazy dog

Но мне нужно искать только этот символ с диапазоном символа 20 (буква «d») и символа 25 (буква «r»).

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

Я пытался ^(.{20})o(.{13})$ безрезультатно.Все, что я могу найти, это ресурсы о диапазонах символов (например, [AZ]) вместо позиционных диапазонов

Ответы [ 5 ]

0 голосов
/ 03 июля 2019

Находит букву «о» между 20-м и 25-м символами в строке:

^.{20}[^o]{0,4}\Ko

** Объяснение:

^               # beginning of line
  .{20}         # 20 any characters
  [^o]{0,4}     # 0 up to 4 any character that is not o
  \K            # forget all we have seen until this psition
  o             # the letter o

Демо

0 голосов
/ 03 июля 2019

Если вы хотите захватить один o, вы можете использовать группу захвата:

^.{20}[^o]*(o)
  • ^ Начало строки
  • .{20} Соответствует любому символу 20раз
  • [^o]* совпадение 0+ раз не o
  • (o) захват в группе 1 совпадение o

Regex demo

Если вы хотите захватывать несколько раз, поддерживается o и конечный / бесконечный вид сзади , вы можете использовать:

(?<=^.{20,24})o
  • (?<= Позитивный взгляд сзади, подтвердите, что слева:
    • ^ Подтвердите начало строки
    • .{20,24} Соответствуйте 20 - 24 раза любому символу, кроме новой строки
  • ) Закрыть положительный прогноз
  • o Совпадение '

Например, демонстрация регулярных выражений в C #

0 голосов
/ 03 июля 2019

У вас есть обязательный поиск для одного регулярного выражения?Unix гордится страстным использованием каналов для соединения команд вместо написания сложных и, следовательно, неопределенных выражений.

в Shell

 echo 'the quick fox jumped over the lazy dog' | cut -c 20-25

или в Javascript:

 'the quick fox jumped over the lazy dog'.substr(19,6)

оба дадут срез «d over», а затем простое выражение, чтобы найти букву «o» и сделать раздел того, что вы хотите на следующем шаге.

0 голосов
/ 03 июля 2019

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

^.{0,21}\K((?:[^o]*)(o*)|(o*)(?:[^o]*)).{4}.*\K$

, но мы столкнемся с трудностями, включая сбой квантификатора 4, когда любой o найдено.

Я предполагаю, что может потребоваться какая-то рекурсия, хотя ее сложно интегрировать.

Демо

0 голосов
/ 03 июля 2019

Вы можете использовать это регулярное выражение:

/^.{0,20}.*(o).*r/

В этом регулярном выражении якорь помещается сначала ^, чтобы убедиться, что совпадение начинается с первого символа строки, затем мы переходим от 0до 20, точно конец буквы d прыжка, затем мы используем .*, потому что мы не знаем, сколько места нужно для достижения символа o и еще одного .*, пока мы не достигнем r,

demo https://regex101.com/r/PLHS43/1

Существует еще один способ использования этого регулярного выражения:

/^.{0,20}.*(o).*?r{1}/

В основном он делает то же самое, но останавливается, когда находит первое r и соответствуетo что находится между символами 20 и 25

демо: https://regex101.com/r/3cX2gw/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...