Как при наличие {8} или {8,9} получить true, но если в тексте кроме {8} и {8,9} присутствуют просто фигурные скобки то false?

Как написать регулятор выражение чтобы при условие:

Если #\{[0-9]+\}|\{[0-9]+,[0-9]+\}# то True, но если в тексте кроме {8} и {8,19} присутствуют обычные фигурные скобки: {,} или {} то False.

Как написать регулятор выражение чтобы при таких условиях получить true или false?


Ответы (1 шт):

Автор решения: Алексей Р

Если задача сформулирована так, что в тексте допустимо только одно вхождение группы чисел в фигурных скобках {\d+}|{\d+,\d+} (далее - Группа) в окружении любых символов, кроме фигурных скобок, то можно использовать выражение ^[^}{]*(?:{\d+}|{\d+,\d+})[^}{]*$. Здесь начинаем просмотр с начала строки, запрещаем символы фигурных скобок [^}{]* до Группы, проверяем Группу, далее до конца строки также запрещаем символы фигурных скобок.

const text = '{8}\n' +
    '{8,9}\n' +
    '{8}{8,9}nlsca\n' +
    '{15}{87,99}{87,99}{2,4}fff\n' +
    '{}\n' +
    '{8}{,}mc;klca\n' +
    '{}{8,9}\n' +
    ' gh ndg dfg{8}{8,9}{,}fbnnhn\n' +
    '{55,45,88}\n' +
    '{55,45,88}{8,9}\n' +
    'ffdsfsfsfaav {55,45} wdjldjasda\n' +
    'lsdlskdlskdls\n' +
    '{55,45}\n' +
    '{55,45}ffdsfsfsfaav'

rg = RegExp('^[^}{]*(?:{\\d+}|{\\d+,\\d+})[^}{]*$')
text.split('\n').forEach(t => console.log(t, rg.test(t)));

Если же таких Групп допустимо несколько, то можно применить выражение

^(?:[^}{]*(?:{\d+}|{\d+,\d+})[^}{]*)+$

т.е. оформить подвыражение от ^ до $ как незахватываемую группу и добавить квантификатор +.

const text = '{8}\n' +
    '{8,9}\n' +
    '{8}{8,9}nlsca\n' +
    '{15}{87,99}  {87,99}dddd{2,4}fff\n' +
    '{}\n' +
    '{8}{,}mc;klca\n' +
    '{}{8,9}\n' +
    ' gh ndg dfg{8}{8,9}{,}fbnnhn\n' +
    '{55,45,88}\n' +
    '{55,45,88}{8,9}\n' +
    'ffdsfsfsfaav {55,45} wdjldjasda\n' +
    'lsdlskdlskdls\n' +
    '{55,45}\n' +
    '{55,45}ffdsfsfsfaav'

rg = RegExp('^(?:[^}{]*(?:{\\d+}|{\\d+,\\d+})[^}{]*)+$')
text.split('\n').forEach(t => console.log(t, rg.test(t)));

→ Ссылка