Простой вопрос с регулярным выражением. У меня есть строка в следующем формате:
this is a [sample] string with [some] special words. [another one]
Что такое регулярное выражение для извлечения слов в квадратных скобках, т.е.
sample
some
another one
Примечание. В моем примере использования скобки не могут быть вложены.
Вы можете использовать следующее регулярное выражение глобально:
\[(.*?)\]
Пояснение:
\[
: [
является мета-символом char и должен быть экранирован, если вы хотите совместить его буквально.(.*?)
: сопоставлять все неживым способом и захватывать его.\]
: ]
является мета-символом char и должен быть экранирован, если вы хотите совместить его буквально.Это должно работать нормально:
\[([^]]+)\]
(?<=\[).+?(?=\])
Будет захватывать контент без скобок
(?<=\[)
- позитивный взгляд за [
.*?
- не жадный матч по содержанию
(?=\])
- позитивный взгляд на ]
РЕДАКТИРОВАТЬ: для вложенных скобок должно работать приведенное ниже регулярное выражение:
(\[(?:\[??[^\[]*?\]))
.
в этом...
Могут ли скобки быть вложенными?
Если нет: \[([^]]+)\]
соответствует одному элементу, включая квадратные скобки. Backreference \1
будет содержать элемент, который будет соответствовать. Если ваш аромат регулярного выражения поддерживает поиск, используйте
(?<=\[)[^]]+(?=\])
Это будет соответствовать только элементу внутри скобок.
/g
в JavaScript).
(?<=\().*?(?=\))
работает хорошо в соответствии с приведенным выше объяснением. Вот пример 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'"
[]
), а не скобок.
Этот код будет извлекать содержимое между квадратными скобками и круглыми скобками
(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))
(?: 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
([[][a-z \s]+[]])
Выше должно работать, учитывая следующее объяснение
символы в квадратных скобках [] определяет класс characte, который означает, что шаблон должен совпадать по крайней мере с одним символом, указанным в квадратных скобках
\ s указывает пробел
+ означает, что по крайней мере один из символов, упомянутых ранее, на +.
AZ
следует добавить в шаблон: ([[][a-zA-Z \s]+[]])
; Я думаю, что это хороший способ, в то время как \
в шаблонах регулярных выражений, которые определяют строковые метки ("и") и смешивают новичков с помощью обратной косой черты в "или" использованиях!
std::regex pattern{R"(["][a-zA-Z \s]+["])"};
Помните, что немногие ответы содержат регулярные выражения, которые используют lookbehinds, которые не будут работать в браузерах, таких как Firefox. Всегда проверяйте свое регулярное выражение здесь: regexr.com перед его использованием
[^]]
быстрее, чем не жадный (?
), А также работает с разновидностями регулярных выражений, которые не поддерживают нежадный. Тем не менее, не жадный выглядит лучше.