从方括号之间提取文本的正则表达式

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

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

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

sample
some
another one

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

900256 次浏览

这应该是正确的:

\[([^]]+)\]

括号可以嵌套吗?

如果不是:\[([^]]+)\]匹配一个项目,包括方括号。反向引用\1将包含要匹配的项。如果你的正则表达式口味支持搜索,请使用

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

这将只匹配括号内的项。

你可以使用下面的正则表达式在全球范围内:

\[(.*?)\]

解释:

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

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

  • 方括号[]内的字符定义了字符类,这意味着模式应该匹配方括号内提到的至少一个字符

  • \s指定一个空格

  • +表示前面提到的至少一个字符为+。

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

将捕获没有括号的内容

  • (?<=\[) -对[的正面回顾

  • .*? -内容的非贪婪匹配

  • (?=\]) -正面展望]

编辑:对于嵌套括号,下面的正则表达式应该工作:

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

这段代码将提取方括号和圆括号之间的内容

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


(?: 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

根据上面给出的解释,(?<=\[).*?(?=\])工作得很好。下面是一个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'"

在R中,试试:

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

如果你不想在匹配中包含括号,下面是正则表达式:(?<=\[).*?(?=\])

让我们来分析一下

.匹配除行结束符以外的任何字符。?=积极的超前。当某个字符串跟在某个字符串后面时,正向向前查找该字符串。?<=积极的向后插入。当某个字符串位于某个字符串的前面时,正向向后查找查找该字符串。引用

积极地向前看(?=)

在表达式B后面找到表达式A:

# EYZ0

正面看背后(?<=)

找到表达式A,其中表达式B 之前:< / p >

# EYZ0

另一种选择

如果您的正则表达式引擎不支持头部和后视,那么您可以使用正则表达式\[(.*?)\]来捕获组中括号的内部,然后您可以根据需要操作组。

这个正则表达式是如何工作的?

括号捕获组中的字符。.*?以一种非贪婪的方式获取括号之间的所有字符(行终止符除外,除非启用了s标志)。

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

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

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

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

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

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

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

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

(\[.*\])

以防万一,你可能有不平衡的括号,你可能会设计一些递归表达式类似于,

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

当然,这与你可能使用的语言或RegEx引擎有关。

RegEx Demo 1


除此之外,

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

RegEx Demo 2

或者,

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

RegEx Demo 3

都是很好的选择。


如果你想简化/修改/探索表达式,可以在右上角的regex101.com面板中进行解释。如果您愿意,还可以在这个链接中查看它如何与一些示例输入匹配。


RegEx电路

jex.im可视化正则表达式:

enter image description here

测试

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}`);
});
}

匹配平衡括号的正则表达式

我需要包含换行符和括号

# EYZ0

要匹配子字符串first #EYZ0和last ]之间,可以使用

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

看到regex演示正则表达式演示#2

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

  • 包括括号:

  • \[[^][]*] - PCRE, Python re/regex, .NET, Golang, POSIX (grep, sed, bash)

  • ECMAScript (JavaScript, c++ std::regex, VBA RegExp)

  • \[[^\]\[]*] - Java, ICU正则表达式

  • \[[^\]\[]*\] - Onigmo (Ruby,需要到处转义括号)

  • 不包括括号:

  • (?<=\[)[^][]*(?=]) - PCRE, Python re/regex, . net (c#等),JGSoft软件

  • \[([^][]*)] - BashGolang - 捕获方括号之间的内容带有一对未转义的圆括号,也见下文

  • \[([^\][]*)] - JavaScriptc++ # EYZ1VBA # EYZ2

  • Java regex, ICU (R stringr)

  • (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby,需要到处转义括号)

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

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

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

  • # eyz0 - # eyz1
  • # eyz0 - # eyz1
  • # eyz0 - # eyz1

蒂姆·皮茨克的回答是在这里

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

几乎就是我一直在寻找的。但有一个问题是,一些传统浏览器可能会在正向向后查找时失败。 所以我今天只能靠自己了:)。我设法这样写:

/([^[]+(?=]))/g

也许它会帮助别人。

console.log("this is a [sample] string with [some] special words. [another one]".match(/([^[]+(?=]))/g));

如果有人想匹配并选择一个在方括号内包含一个或多个圆点的字符串,如&;(fu.bar)"使用以下方法:

(?<=\[)(\w+\.\w+.*?)(?=\])

Regex Tester