Я нашел решения для поиска n-го вхождения, но не смог найти каждого n-го вхождения.

У меня есть такая строка, как "key1~value1~key2~value2~key3~value3~".

Какое регулярное выражение будет соответствовать каждому второму вхождению ~?

Ключ1 ~ значение1 ~ ключ2 ~ значение2 ~ ключ3 ~ значение3 ~

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

2
alpert 5 Май 2016 в 12:53

3 ответа

Лучший ответ

Вы можете использовать

~(?=(?:[^~]*~[^~]*~)*[^~]*$)

Шаблон соответствует:

  • ~ - тильда, за которой следует ...
  • (?=(?:[^~]*~[^~]*~)*[^~]*$) - 0+ без тильд + ~ x 2 раза, 0+ раз, а затем 0+ без тильд до конца строки. Таким образом, эта проверка проверяет наличие четного числа тильд до конца строки после совпадения с первой тильдой.

enter image description here

2
Wiktor Stribiżew 5 Май 2016 в 10:25

Первая группа неперекрывающихся вхождений ~.*?(~). Попробуйте: http://regexr.com/3dc15.

0
George Sovetov 5 Май 2016 в 09:56

Вы должны убедиться, что перед этим не было четного числа ~:

(?<!^([^~]*~[^~]*~)*[^~]*)~

Попробуйте онлайн!


Как это работает:

(?<!^([^~]*~[^~]*~)*[^~]*)~    Our regex.
                          ~    Matches a tilde (~).
(?<!                     )     Assert that before it is not:
    ^                              the beginning
     (            )*               followed by zero or more times:
      [^~]*~[^~]*~                     two tildes, no matter what comes within
                    [^~]*          followed by non-tildes.
1
Community 20 Июн 2020 в 09:12