Регулярний вираз для вилучення тексту між квадратними дужками


411

Просте регулярне питання. У мене є рядок у такому форматі:

this is a [sample] string with [some] special words. [another one]

Який регулярний вираз для вилучення слів у квадратних дужках, тобто.

sample
some
another one

Примітка. У моєму випадку використання дужки не можна вкладати.

Відповіді:


766

Ви можете використовувати наступне регулярний вираз на глобальному рівні :

\[(.*?)\]

Пояснення:

  • \[: [є мета-знаком, і його потрібно уникнути, якщо ви хочете його відповідати буквально.
  • (.*?) : співставляйте все не жадібно і захоплюйте це.
  • \]: ]є мета-знаком, і його потрібно уникнути, якщо ви хочете його відповідати буквально.

9
Інший метод відповіді, використовуючи [^]]швидше, ніж не жадібний ( ?), а також працює з ароматами регулярного вираження, які не підтримують ненаситні Однак нежитливо виглядає приємніше.
Ipsquiggle

183
Як виключити [ ]з результату (результату)?
Міккі Тін

9
@MickeyTin, якщо ви використовуєте Java, ви можете згрупувати її за допомогою групи (1) над просто групою (), тому "[]" не піде разом
abyteneverlie

21
Це збігається лише з першою подією
hfatahi

9
Як виключаєте дужки із зворотного?
jzadra

119
(?<=\[).+?(?=\])

Захопить вміст без дужок

  • (?<=\[) - позитивний погляд за [

  • .*? - не жадібна відповідність вмісту

  • (?=\]) - позитивний підхід для ]

EDIT: для вкладених дужок працює наступний регулярний вираз:

(\[(?:\[??[^\[]*?\]))

3
@igaurav Я перевірив це, і він працює. Однак він не працюватиме в середовищах, які не підтримують відсталість, як Javascript. Можливо, це ваш випадок?
Адам Мощинський

Адам, ваше рішення вкладених дужок не вдається, коли в ньому є рядок з a ....
patrick

89

Це повинно вийти нормально:

\[([^]]+)\]

5
У моєму випадку використання тексту, що містить текст у дужках, може містити нові рядки, і це регулярне вираження спрацьовує, поки прийнята відповідь не відповідає.
Дейв

1
що означає клас символів [^]]? Що це відповідає?
Річард

3
@Richard, The ^ заперечує клас символів. Це означає "будь-який символ, який не є]".
jasonbar

8
Я думаю, що це не працює, як очікувалося, вам слід скористатися, \[([^\[\]]*)\]щоб отримати вміст у самій внутрішній дужці. Якщо ви подивитесь на lfjlksd [ded[ee]22]то, \[([^]]+)\]ви отримаєте, [ded[ee]поки запропонований вираз повернеться [ee]. testie за посиланням
TMC

1
Надайте, будь ласка, приклади "sed" та "awk", щоб використовувати цей регулярний вираз та витягувати текст. Дякую.
valentt

32

Чи можуть дужки вкладатись?

Якщо ні: \[([^]]+)\]відповідає одному елементу, включаючи квадратні дужки. Зворотний зв'язок \1буде містити предмет, який повинен відповідати. Якщо ваш аромат регексу підтримує пошук, використовуйте

(?<=\[)[^]]+(?=\])

Це відповідатиме лише предмету всередині дужок.


@KunalMukherjee: Ні, регулярний вираз може відповідати будь-якій кількості разів. Але деякі аромати регулярного вираження повинні бути чітко сказані, щоб повторно застосовувати регулярний вираз (наприклад, використовуючи /gпрапор у JavaScript).
Тім Піцкер

14

Якщо ви не хочете включати дужки в матч, ось регулярний вираз: (?<=\[).*?(?=\])

Давайте розбимо його

.Відповідає будь-якому символу , за винятком лінії термінатора. ?=Є позитивним випередженням . Позитивний lookahead знаходить рядок, коли після нього настає певна рядок. ?<=Є позитивним переглядом назад . Позитивний вигляд ззаду знаходить рядок, коли певна рядок передує їй. Цитуючи це ,

Попередньо позитивно (? =)

Знайдіть вираз A, де вираз B наступний:

A(?=B)

Позир за позитивом (? <=)

Знайдіть вираз А, де вираз B передує:

(?<=B)A

Альтернатива

Якщо ваш механізм регулярних виразів не підтримує динаміки пошуку та дихання, тоді ви можете використовувати регулярний вираз \[(.*?)\]для зйомки внутрішніх частин дужок у групі, а потім ви можете маніпулювати групою за потребою.

Як працює ця регулярна виразка?

Дужки фіксують символів у групі. .*?Отримує всі символи між дужками (для термінаторів лінії , за винятком, якщо не мати sвключений прапор) таким чином , щоб не жадібний.


12

(?<=\[).*?(?=\])працює добре згідно пояснення, наведеного вище. Ось приклад Python:

import re 
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')"
re.search('(?<=\[).*?(?=\])', str).group()
"'formPagination_bottom',2,'Page',true,'1',null,'2013'"

1
Ви завжди повинні використовувати форматування коду для регулярних виразів, де б вони не з’являлися. Якщо регулярний вираз є в тексті, а не в кодовому блоці, ви можете використовувати зворотні посилання для їх форматування. ( ref )
Алан Мур

1
Також питання стосувалося квадратних дужок ( []), а не дужок.
Алан Мур

6

На всякий випадок, можливо, у вас були незбалансовані дужки , ви, можливо, спроектуєте деякий вираз із рекурсією, подібною до,

\[(([^\]\[]+)|(?R))*+\]

що, звичайно, стосуватиметься мовного або RegEx двигуна, яким ви можете користуватися.

RegEx Demo 1


Крім того, що,

\[([^\]\[\r\n]*)\]

RegEx Demo 2

або,

(?<=\[)[^\]\[\r\n]*(?=\])

RegEx Demo 3

є хорошими варіантами для вивчення.


Якщо ви хочете спростити / змінити / дослідити вираз, це було пояснено на верхній правій панелі regex101.com . Якщо ви хочете, ви також можете подивитися за цим посиланням , як це буде відповідати деяким зразкам даних.


RegEx Circuit

jex.im візуалізує регулярні вирази:

введіть тут опис зображення

Тест

const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Джерело

Регулярне вираження, щоб відповідати збалансованим дужкам


4

якщо ви хочете заповнити лише маленьку літеру алфавіту між квадратними дужками az

(\[[a-z]*\])

якщо ви хочете, щоб малі та великі літери a-zA-Z

(\[[a-zA-Z]*\]) 

якщо ви хочете невеликі ковпачки та цифри з літером a-zA-Z0-9

(\[[a-zA-Z0-9]*\]) 

якщо ви хочете, щоб все було між квадратними дужками

якщо ви хочете текст, цифру та символи

(\[.*\])

3
([[][a-z \s]+[]])

Вище слід працювати, даючи наступне пояснення

  • символи в квадратних дужках [] визначає клас символів, що означає, що візерунок повинен відповідати принаймні одному символу, зазначеному в квадратних дужках

  • \ s вказує пробіл

  •  + означає щонайменше один із символів, згаданий раніше до +.


У чутливих випадках A-Zслід додати шаблон ([[][a-zA-Z \s]+[]]):; Я думаю, що це хороший спосіб, перебуваючи \ в шаблонах регулярних виразів, що визначає рядкові позначки ("і") і змішувати новачків шляхом обробки зворотної косої риски в "або" звичаях!
MohaMad

Єдина відповідь, яка працювала для мене на регулярному вираженні C ++ (за винятком того, що я роблю це з цитатами замість дужок). std::regex pattern{R"(["][a-zA-Z \s]+["])"};
StackAttack

3

Цей код витягує вміст між квадратними дужками та дужками

(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))

(?: non capturing group
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses
| or
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets

3

В R спробуйте:

x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"

.. або gsub(pat, "\\1", x, perl=TRUE)де patрегулярний вираз, який ви надали ..
Karsten W.


0

Щоб відповідати підрядку між першою [ та останньою ] , ви можете використовувати

\[.*\]            # Including open/close brackets
\[(.*)\]          # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\])   # Excluding open/close brackets (using lookarounds)

Перегляньте демонстраційну виразку та демо-версію №2 .

Використовуйте такі вирази, щоб відповідати рядки між найближчими квадратними дужками :

  • Включаючи дужки:

    • \[[^][]*]- PCRE, Python re/ regex, .NET, Golang, POSIX (grep, sed, bash)
    • \[[^\][]*]- ECMAScript (JavaScript, C ++ std::regex, VBA RegExp)
    • \[[^\]\[]*] - Java regex
    • \[[^\]\[]*\] - Onigmo (Ruby, потрібно знімати дужки скрізь)
  • Без дужок:

    • (?<=\[)[^][]*(?=])- PCRE, Python re/ regex, .NET (C # тощо), ICU (Rstringr ), програмне забезпечення JGSoft
    • \[([^][]*)]- Баш , Голанг - захоплення вміст між квадратними дужками із парою неекранованих дужок, також дивіться нижче
    • \[([^\][]*)]- JavaScript , C ++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) - Java regex
    • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, потрібно знімати дужки скрізь)

ПРИМІТКА : *відповідає 0 або більше символів, використовуйте+ для поєднання 1 або більше, щоб уникнути порожніх рядкових збігів у отриманому списку / масиві.

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

Якщо вам потрібно зіставити вкладені дужки , ви можете побачити рішення в виразі "Регулярний", щоб відповідати збалансованим круглим дужкам і замінити круглі дужки на квадратні, щоб отримати необхідну функціональність. Ви повинні використовувати групи захоплення для доступу до вмісту з виключеною дужкою відкриття / закриття:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.