Answers:
(?<=\[).+?(?=\])
将捕获不带括号的内容
(?<=\[)
-积极向后看 [
.*?
-内容的非贪婪匹配
(?=\])
-积极向前看 ]
编辑:对于嵌套括号下面的正则表达式应该工作:
(\[(?:\[??[^\[]*?\]))
.
...
括号可以嵌套吗?
如果不是:\[([^]]+)\]
匹配一项,包括方括号。向后引用\1
将包含要匹配的项目。如果您的正则表达式样式支持环视,请使用
(?<=\[)[^]]+(?=\])
这只会匹配括号内的项目。
/g
JavaScript中的标志)。
如果您不想在比赛中包含方括号,请使用正则表达式: (?<=\[).*?(?=\])
在.
任何字符,除了行结束符匹配。该?=
是积极的展望。当某个字符串后面有一个正向超前查找时,它将找到一个字符串。这?<=
是一个积极的眼光。当某个字符串位于字符串之后时,正向后方查找字符串。引用此,
向前看积极(?=)
在表达式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(红宝石)演示
[^]]
要比非贪婪(?
)更快,并且还可以用于不支持非贪婪的正则表达式。但是,非贪婪看起来更好。