Proste pytanie regularne. Mam ciąg w następującym formacie:
this is a [sample] string with [some] special words. [another one]
Jakie jest wyrażenie regularne do wyodrębnienia słów w nawiasach kwadratowych, tj.
sample
some
another one
Uwaga: W moim przypadku nie można zagnieżdżać nawiasów.
[^]]
jest szybsza niż non-chciwy (?
), a także działa ze smakami wyrażeń regularnych, które nie obsługują nie-chciwości. Jednak niechciany wygląda ładniej.[
]
z wyników (wyników)?Przechwytuje zawartość bez nawiasów
(?<=\[)
- pozytywne spojrzenie za[
.*?
- niechciane dopasowanie treści(?=\])
- pozytywne spojrzenie w przyszłość]
EDYCJA: dla nawiasów zagnieżdżonych poniższe wyrażenie regularne powinno działać:
źródło
.
...To powinno zadziałać ok:
źródło
\[([^\[\]]*)\]
aby uzyskać zawartość w najbardziej wewnętrznym nawiasie. Jeśli spojrzysz nalfjlksd [ded[ee]22]
to\[([^]]+)\]
, dostaniesz cię,[ded[ee]
dopóki proponowane wyrażenie wróci[ee]
. testowany w linkuCzy można zagnieżdżać nawiasy?
Jeśli nie:
\[([^]]+)\]
pasuje do jednego elementu, w tym nawiasów kwadratowych. Odsyłacz wsteczny\1
będzie zawierał element do dopasowania. Jeśli Twój smak regularny obsługuje wygląd, użyjTo będzie pasować tylko do elementu w nawiasach.
źródło
/g
flagi w JavaScript).Jeśli nie chcesz uwzględniać nawiasów w dopasowaniu, oto regex:
(?<=\[).*?(?=\])
Rozwalmy to
.
Dopasowuje dowolny znak z wyjątkiem terminatory linii. To?=
jest pozytywne spojrzenie w przyszłość . Pozytywny lookahead znajduje ciąg, gdy określony ciąg następuje po nim.?<=
Jest pozytywny lookbehind . Pozytywne spojrzenie znajduje ciąg, gdy określony ciąg poprzedza. Cytując to ,Alternatywa
Jeśli Twój silnik wyrażeń regularnych nie obsługuje funkcji lookaheads i lookbehinds, możesz użyć wyrażenia regularnego
\[(.*?)\]
do przechwycenia wewnętrznych elementów nawiasów w grupie, a następnie możesz w razie potrzeby manipulować grupą.Jak działa ten regex?
Nawiasy przechwytują znaki w grupie.
.*?
Dostaje wszystkie znaki w nawiasach (za wyjątkiem linii terminatorów, chyba że maszs
flagi włączone) w sposób, który nie jest chciwy.źródło
(?<=\[).*?(?=\])
działa dobrze, zgodnie z wyjaśnieniem podanym powyżej. Oto przykład w języku Python:źródło
[]
), a nie nawiasów.Na wszelki wypadek możesz mieć niewyważone nawiasy kwadratowe , prawdopodobnie możesz zaprojektować wyrażenie z rekurencją podobną do,
który oczywiście odnosi się do języka lub silnika RegEx, którego możesz używać.
Demo RegEx 1
Inne niż to,
RegEx Demo 2
lub,
RegEx Demo 3
to dobre opcje do zwiedzania.
Jeśli chcesz uprościć / zmodyfikować / zbadać wyrażenie, zostało to wyjaśnione w prawym górnym panelu strony regex101.com . Jeśli chcesz, możesz również obejrzeć w tym linku , jak będzie pasował do niektórych przykładowych danych wejściowych.
RegEx Circuit
jex.im wizualizuje wyrażenia regularne:
Test
Źródło
Wyrażenie regularne pasujące do zrównoważonych nawiasów
źródło
jeśli chcesz wstawić tylko małą literę alfabetu między nawias kwadratowy az
jeśli chcesz małe i wielkie litery a-zA-Z
jeśli chcesz małe litery i cyfrę a-zA-Z0-9
jeśli chcesz wszystko między nawiasami kwadratowymi
jeśli chcesz tekst, liczbę i symbole
źródło
Powyższe powinno działać z poniższym wyjaśnieniem
znaki w nawiasach kwadratowych [] definiują klasę characte, co oznacza, że wzór powinien pasować co najmniej jeden znak wymieniony w nawiasach kwadratowych
\ s określa spację
+ oznacza przynajmniej jedną ze wspomnianych wcześniej postaci +.
źródło
A-Z
należy dodać do wzorca([[][a-zA-Z \s]+[]])
:; Myślę, że to dobry sposób, podczas gdy\
we wzorcach wyrażeń regularnych, które definiują znaki ciągów („i”) i mieszanie początkujących przez obsługę odwrotnego ukośnika w „lub” zastosowaniach!std::regex pattern{R"(["][a-zA-Z \s]+["])"};
Ten kod wyodrębni zawartość między nawiasami kwadratowymi a nawiasami
źródło
W R spróbuj:
źródło
gsub(pat, "\\1", x, perl=TRUE)
, gdziepat
jest podane wyrażenie regularne ...Potrzebowałem, łącznie z nowymi wierszami i nawiasami klamrowymi
\[[\s\S]+\]
źródło
Aby dopasować podciąg między pierwszym
[
a ostatnim]
, możesz użyćZobacz prezentację wyrażenia regularnego i prezentację wyrażenia regularnego # 2 .
Użyj następujących wyrażeń, aby dopasować ciągi znaków między najbliższymi nawiasami kwadratowymi :
W tym nawiasy:
\[[^][]*]
- PCRE, Pythonre
/regex
, .NET, Golang, POSIX (grep, sed, bash)\[[^\][]*]
- ECMAScript (JavaScript, C ++std::regex
, VBARegExp
)\[[^\]\[]*]
- Wyrażenie regularne Java\[[^\]\[]*\]
- Onigmo (Ruby, wymaga ucieczki nawiasów wszędzie)Z wyłączeniem nawiasów:
(?<=\[)[^][]*(?=])
- PCRE, Pythonre
/regex
, .NET (C # itp.), ICU (Rstringr
), oprogramowanie JGSoft\[([^][]*)]
- Bash , Golang - przechwyć zawartość między nawiasami kwadratowymi za pomocą pary nieokreślonych nawiasów, patrz także poniżej\[([^\][]*)]
- JavaScript , C ++std::regex
, VBARegExp
(?<=\[)[^\]\[]*(?=])
- Wyrażenie regularne Java(?<=\[)[^\]\[]*(?=\])
- Onigmo (Ruby, wymaga ucieczki nawiasów wszędzie)UWAGA :
*
pasuje do 0 lub więcej znaków, użyj+
aby dopasować 1 lub więcej znaków, aby uniknąć dopasowania pustych ciągów w wynikowej liście / tablicy.Ilekroć dostępne jest oba wsparcie wyszukiwania, powyższe rozwiązania polegają na nich, aby wykluczyć nawias otwierający / zamykający prowadzący / kończący. W przeciwnym razie polegaj na przechwytywaniu grup (udostępniono łącza do najpopularniejszych rozwiązań w niektórych językach).
Jeśli potrzebujesz dopasować zagnieżdżone nawiasy , możesz zobaczyć rozwiązania w wyrażeniu Regular, aby dopasować zrównoważony nawias nić i zastąpić okrągłe nawiasy kwadratowe, aby uzyskać niezbędną funkcjonalność. Należy użyć grup przechwytywania, aby uzyskać dostęp do zawartości z wyłączeniem nawiasów otwierających / zamykających:
\[((?:[^][]++|(?R))*)]
- PHP PCRE\[((?>[^][]+|(?<o>)\[|(?<-o>]))*)]
- Demo .NET\[(?:[^\]\[]++|(\g<0>))*\]
- Demo Onigmo (Ruby)źródło