2016-02-21 1 views
3

Используя регулярное выражение, учитывая следующий текст, как я могу совместить содержимое между квадратными скобками, но только если он не пуст?Соответствие между открытыми и закрывающимися скобками, если не пустым?

{ 
    "key": [ 
    ], 

    "match": [ 
     1, 
     2, 
     3, 
     4 
    ] 
} 

/:\s*\[([^\]\[]+)\]/g: Это моя попытка, и в то время как он соответствует ничего внутри скобок, включая пробелы (желаемому) Я не могу работать, как соответствовать только в скобках, по существу пустой массив (то есть) не только пробельные.

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

Очень важно, что я захвачу белое пространство так, как я хочу, чтобы сохранить форматирование, но я не хочу, чтобы захватить содержимое между скобками, если его нет или только пробельные/перевода строки и т.д.

Вы можете видеть и играть с моим регулярным выражением здесь: https://regex101.com/r/iN9cD5/3

СПАСИБО.

ответ

3

Вы можете использовать отрицательный предпросмотр:

:\s*\[(?!\s*])([^\]\[]+)\] 
     ^^^^^^^ 

См demo

(?!\s*]) будет провалить матч, если есть только пробельные символы или ничего после [ до следующего ].

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

:\s*\[(?!\s*])([^][]+)]` 

demo Смотреть другие. [^][] соответствует любому символу, но [ и ] из-за умного размещения ] сразу после открытия класса символов [ и [ не обязательно должен быть экранирован в классе символов регулярного выражения PCRE.

+1

Отлично, я знал, что это должно быть что-то вроде взгляда вперед, просто не мог обернуть мою голову вокруг синтаксиса! Спасибо! – Camsoft

+0

BTW, аромат регулярного выражения - это PHP, вы можете избавиться от некоторых экранирующих символов: [': \ s * \ [(?! \ S *]) ([^] [] +)]'] (https: // regex101.com/r/bE0jM5/2). –

+0

Отлично, вкус, который я использую, это PCRE, так что это будет немного легче читать. – Camsoft

0

Вы можете попробовать эту модель:

/:\s*\[(\s+\S[^\]\[]+)\]/g 

demo

Он добавляет в проверке, что несколько пробелов, за которым следует без пробела.

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