简单的正则表达式问题。我有一个字符串的以下格式:

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

提取方括号内的单词的正则表达式是什么?

sample
some
another one

注意:在我的用例中,括号不能嵌套。


当前回答

要匹配第一个[和最后一个]之间的子字符串,可以使用

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

请看一个正则表达式演示和一个正则表达式演示#2。

使用以下表达式来匹配最接近的方括号之间的字符串:

Including the brackets: \[[^][]*] - PCRE, Python re/regex, .NET, Golang, POSIX (grep, sed, bash) \[[^\][]*] - ECMAScript (JavaScript, C++ std::regex, VBA RegExp) \[[^\]\[]*] - Java, ICU regex \[[^\]\[]*\] - Onigmo (Ruby, requires escaping of brackets everywhere) Excluding the brackets: (?<=\[)[^][]*(?=]) - PCRE, Python re/regex, .NET (C#, etc.), JGSoft Software \[([^][]*)] - Bash, Golang - capture the contents between the square brackets with a pair of unescaped parentheses, also see below \[([^\][]*)] - JavaScript, C++ std::regex, VBA RegExp (?<=\[)[^\]\[]*(?=]) - Java regex, ICU (R stringr) (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, requires escaping of brackets everywhere)

注意:*匹配0个或更多字符,使用+匹配1个或更多字符以避免在结果列表/数组中匹配空字符串。

只要这两种环视支持都可用,上述解决方案就依赖于它们来排除前导/后导的开/闭括号。否则,依赖于捕获组(提供了一些语言中最常见解决方案的链接)。

如果需要匹配嵌套括号,可以在正则表达式中看到匹配平衡括号线程的解决方案,并将圆括号替换为方括号以获得必要的功能。你应该使用捕获组来访问不包含左/右括号的内容:

\[((?:[^][]++|(? r))*)] - PHP pcre \[((?>[^][]+|(?<o>)\[|(?<-o>]))*) \[(?:[^\]\[]++|(\g<0>))*\] - Onigmo (Ruby) demo

其他回答

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

根据以下解释,上述方法应该有效

方括号[]内的字符定义了字符类,这意味着模式应该匹配方括号内提到的至少一个字符 \s指定一个空格 +表示前面提到的至少一个字符为+。

这应该是正确的:

\[([^]]+)\]

如果你想要填充方括号a-z之间的小字母

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

如果你想要小写字母a-zA-Z

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

如果你想要小写字母和数字字母a-zA-Z0-9

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

如果你想要所有在方括号之间的东西

如果你想要文字,数字和符号

(\[.*\])

你可以全局使用以下正则表达式:

\[(.*?)\]

解释:

\[:[是一个元字符,如果你想字面上匹配它,就需要转义。 (.*?):以非贪婪的方式匹配所有内容并捕获它。 \]:]是一个元字符,如果你想字面上匹配它,就需要转义。

在R中,试试:

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