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


411

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

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

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

sample
some
another one

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

Answers:


765

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

\[(.*?)\]

说明:

  • \[[是元字符,如果要按字面值进行匹配,则需要转义。
  • (.*?) :以非贪婪的方式匹配所有内容并捕获。
  • \]]是元字符,如果要按字面值进行匹配,则需要转义。

9
另一个答案的使用方法[^]]要比非贪婪(?)更快,并且还可以用于不支持非贪婪的正则表达式。但是,非贪婪看起来更好。
Ipsquiggle 2010年

183
如何[ ]从输出中排除(结果)?
米奇锡

9
@MickeyTin,如果您使用的是Java,则可以使用group(1)而不是group()对其进行分组,因此'[]'不会一起使用
abyteneverlie 2013年

21
这仅与第一次出现匹配
hfatahi

9
如何从退货中排除括号?
jzadra

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

将捕获不带括号的内容

  • (?<=\[) -积极向后看 [

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

  • (?=\]) -积极向前看 ]

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

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

3
@igaurav我已经检查了它并且有效。但是,在不支持像Javascript这样的幕后环境的环境中,它将无法正常工作。也许那是你的情况?
亚当·莫斯钦斯基(AdamMoszczyński)

亚当,当其中有一个字符串时,您的嵌套方括号解决方案将失败....
patrick

89

这样应该可以了:

\[([^]]+)\]

5
在我的用例中,方括号中的文本可能包含新行,并且此正则表达式有效,而可接受的答案无效。
戴夫

1
字符类[^]]是什么意思?它匹配什么?
理查德

3
@ Richard,^否定字符类。它的意思是“任何不是]的字符”。
jasonbar

8
我认为它不能按预期方式工作,您应该使用它\[([^\[\]]*)\]来将内容放在最里面的括号中。如果你仔细看看lfjlksd [ded[ee]22],然后\[([^]]+)\]会得到你[ded[ee]而提议的表达将返回[ee]链接中的被测试者
TMC

1
您能提供“ sed”和“ awk”示例来使用此正则表达式并提取文本吗?谢谢。
valentt

32

括号可以嵌套吗?

如果不是:\[([^]]+)\]匹配一项,包括方括号。向后引用\1将包含要匹配的项目。如果您的正则表达式样式支持环视,请使用

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

这只会匹配括号内的项目。


@KunalMukherjee:不,正则表达式可以匹配任意多次。但是,需要明确告知某些正则表达式类型以重复应用正则表达式(例如,通过使用/gJavaScript中的标志)。
蒂姆·皮茨克 Tim Pietzcker)'17

14

如果您不想在比赛中包含方括号,请使用正则表达式: (?<=\[).*?(?=\])

让我们分解一下

.任何字符,除了行结束符匹配。该?=积极的展望。当某个字符串后面有一个正向超前查找时,它将找到一个字符串。这?<=是一个积极的眼光。当某个字符串位于字符串之后时,正向后方查找字符串。引用

向前看积极(?=)

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

A(?=B)

向后看积极(?<=)

查找表达式B前面的表达式A:

(?<=B)A

另类

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

此正则表达式如何工作?

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


12

(?<=\[).*?(?=\])按照上面给出的解释,效果很好。这是一个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'"

1
无论正则表达式出现在何处,都应始终使用代码格式。如果正则表达式在文本而不是代码块中,则可以使用反引号对它们进行格式化。(参考
艾伦·摩尔

1
另外,问题是关于方括号([]),而不是括号。
艾伦·摩尔

6

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

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

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

正则演示1


除此之外,

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

RegEx演示2

要么,

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

RegEx演示3

是探索的好选择。


如果您希望简化/修改/探索该表达式,请在regex101.com的右上方面板中进行说明。如果您愿意,您还可以在此链接中观看,它如何与某些示例输入匹配。


RegEx电路

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

资源

正则表达式以匹配括号


4

如果您只想填充方括号az之间的小字母

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

如果您要小写大写字母a-zA-Z

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

如果您要使用小写字母和数字字母a-zA-Z0-9

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

如果您想要方括号之间的所有内容

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

(\[.*\])

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

上面应该给出以下解释才能工作

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

  • \ s指定一个空格

  •  +表示+之前提到的字符中的至少一个。


在敏感情况下A-Z应该增加模式:([[][a-zA-Z \s]+[]]); 我认为这是一种好方法,而\ 在正则表达式模式中,它可以在字符串标记(“和”)中进行定义,并通过使用“或”用法中的反斜杠来混合新手!
MohaMad

对我来说,唯一适用于C ++正则表达式的答案(除了im用引号而不是方括号代替)。std::regex pattern{R"(["][a-zA-Z \s]+["])"};
StackAttack

3

此代码将提取方括号和括号之间的内容

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

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

3

在R中,尝试:

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

..或者gsub(pat, "\\1", x, perl=TRUE),在那里pat为您提供的正则表达式。
卡斯滕·W·


0

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

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

参见regex演示regex演示#2

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

  • 包括括号:

    • \[[^][]*]- 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 - 捕获方括号之间的内容物与一对非转义括号的,也参见下文
    • \[([^\][]*)]- 的JavaScriptC ++std::regexVBARegExp
    • (?<=\[)[^\]\[]*(?=]) -Java正则表达式
    • (?<=\[)[^\]\[]*(?=\]) -Onigmo(Ruby,需要到处都转义括号)

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

只要两种环视支持均可用,上述解决方案就将它们排除在前/后跟打开/关闭支架之外。否则,请依靠捕获组(已提供某些语言的最常见解决方案的链接)。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.