Регулярное выражение, совпадающее со строкой или концом строки - PullRequest
0 голосов
/ 16 марта 2020

Мне нужно javascript регулярное выражение, которое соответствует строкам, которые начинаются с # и заканчиваются либо \ n #, либо концом строки (который всегда идет первым).

Samples - https://regex101.com/r/rpjPkl/4

Для следующих образцов:

Образец 1: #always: test\n#asdf

Результаты: #always: test с группами always и test

Образец 2: #always: test\n#range: [0, 255]

Результаты: #always: test с группами always и test

и #range: [0, 255] с группами range и [0, 255]

Я пробовал (часами ...) различные версии следующего:

#([a-z]+):(.+)((\\n#)|$)
#([a-z]+):((^\\n#)|$)+

Обновление 1:

Результаты группы должны выделяться \n, если его нашли. Если невозможно получить вышеуказанные группы, мне нужно, как минимум, следующие результаты групп

Образец 1 ожидающих групп: #always: test

Образец 2 ожидающих групп: #always: test и #range: [0, 255]

Обратите внимание, что \n может существовать как группа, но не может быть включена в вышеуказанные группы.


Обновление 2

Я предоставляю более исчерпывающую информацию образец, который должен охватывать (мы надеемся) весь сценарий ios.

Ссылка живого образца: https://regex101.com/r/rpjPkl/4 Ответ должен быть проверен на соответствие тестовой строке, найденной в этой ссылке (аналогично приведенному ниже. Пример 3 ).

Образец 3:

#always: line1\nline#2\n#range: [0, 255]\n#obj: { prop: '#a1',
prop2: 2 }\n#more: "where #2"

Ожидаемые совпадения / группы

Совпадение 1: #always: line1\nline#2 Группа 1: always Группа 2: line1\nline#2

Матч 2: #range: [0, 255] Группа 1: range Группа 2: [0, 255]

Матч 3:

#obj: { prop: '#a1',
            prop2: 2 }

Группа 1: obj Группа 2:

{ prop: '#a1',
            prop2: 2 }

Матч 4: #more: "where #2" Группа 1: more Группа 2: "where #2"

1 Ответ

1 голос
/ 16 марта 2020

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

const samples = [
  '#always: test\n#asdf',
  '#always: test\n#range: [0, 255]'
]

function foo(sample)
{
  // split first, and then iterate over each sentence
  return sample.split('\n').map(sentence => {
    // this expression is now very basic
    return sentence.match(/^#([a-z]+):\s*(.+)/)
    // empty matches yield null and will get filtered later
  }).filter(match => match !== null)
}

samples.forEach(sample => {
  console.log(foo(sample));
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...