Answers:
(?<=\[).+?(?=\])
将捕获不带括号的内容
(?<=\[) -积极向后看 [
.*? -内容的非贪婪匹配
(?=\]) -积极向前看 ]
编辑:对于嵌套括号下面的正则表达式应该工作:
(\[(?:\[??[^\[]*?\]))
....
括号可以嵌套吗?
如果不是:\[([^]]+)\]匹配一项,包括方括号。向后引用\1将包含要匹配的项目。如果您的正则表达式样式支持环视,请使用
(?<=\[)[^]]+(?=\])
这只会匹配括号内的项目。
/gJavaScript中的标志)。
如果您不想在比赛中包含方括号,请使用正则表达式: (?<=\[).*?(?=\])
在.任何字符,除了行结束符匹配。该?=是积极的展望。当某个字符串后面有一个正向超前查找时,它将找到一个字符串。这?<=是一个积极的眼光。当某个字符串位于字符串之后时,正向后方查找字符串。引用此,
向前看积极(?=)
在表达式B后面找到表达式A:
A(?=B)向后看积极(?<=)
查找表达式B前面的表达式A:
(?<=B)A
如果您的正则表达式引擎不支持先行和后退,则可以使用正则表达式 \[(.*?)\]捕获组中括号的内部,然后可以根据需要操作组。
括号捕获组中的字符。以非贪婪的方式.*?获取方括号之间的所有字符(行终止符除外,除非s启用了标志)。
(?<=\[).*?(?=\])按照上面给出的解释,效果很好。这是一个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))*+\]
当然,这与您可能使用的语言或RegEx引擎有关。
除此之外,
\[([^\]\[\r\n]*)\]
要么,
(?<=\[)[^\]\[\r\n]*(?=\])
是探索的好选择。
如果您希望简化/修改/探索该表达式,请在regex101.com的右上方面板中进行说明。如果您愿意,您还可以在此链接中观看,它如何与某些示例输入匹配。
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}`);
});
}
([[][a-z \s]+[]])
上面应该给出以下解释才能工作
方括号[]中的字符定义了characte类,这意味着模式应与方括号中提到的至少一个字符匹配
\ s指定一个空格
+表示+之前提到的字符中的至少一个。
A-Z应该增加模式:([[][a-zA-Z \s]+[]]); 我认为这是一种好方法,而\ 在正则表达式模式中,它可以在字符串标记(“和”)中进行定义,并通过使用“或”用法中的反斜杠来混合新手!
std::regex pattern{R"(["][a-zA-Z \s]+["])"};
要匹配第一个和最后一个之间的 [ ]子字符串,可以使用
\[.*\] # Including open/close brackets
\[(.*)\] # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\]) # Excluding open/close brackets (using lookarounds)
使用以下表达式匹配最接近的方括号之间的字符串:
包括括号:
\[[^][]*]- PCRE,Python的re/ regex,.NET,Golang,POSIX(grep的,sed的,bash)的\[[^\][]*]-ECMAScript(JavaScript,C ++ std::regex,VBA RegExp)\[[^\]\[]*] -Java正则表达式\[[^\]\[]*\] -Onigmo(Ruby,需要到处都转义括号)不包括括号:
(?<=\[)[^][]*(?=])- PCRE,Python的re/ regex,.NET(C#等),ICU(R stringr),JGSoft软件\[([^][]*)]- 击,Golang - 捕获方括号之间的内容物与一对非转义括号的,也参见下文\[([^\][]*)]- 的JavaScript,C ++std::regex,VBARegExp(?<=\[)[^\]\[]*(?=]) -Java正则表达式(?<=\[)[^\]\[]*(?=\]) -Onigmo(Ruby,需要到处都转义括号)注意:*匹配0个或多个字符,用于+匹配1个或多个字符,以避免在结果列表/数组中出现空字符串匹配。
只要两种环视支持均可用,上述解决方案就将它们排除在前/后跟打开/关闭支架之外。否则,请依靠捕获组(已提供某些语言的最常见解决方案的链接)。
如果需要匹配嵌套括号,则可以在正则表达式中看到解决方案以匹配平衡的括号线程,并用方括号替换圆括号以获取必要的功能。您应该使用捕获组来访问内容,但不包括开括号:
\[((?:[^][]++|(?R))*)]- PHP PCRE\[((?>[^][]+|(?<o>)\[|(?<-o>]))*)]- .NET演示\[(?:[^\]\[]++|(\g<0>))*\]- Onigmo(红宝石)演示
[^]]要比非贪婪(?)更快,并且还可以用于不支持非贪婪的正则表达式。但是,非贪婪看起来更好。