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

Obi*_*obi 358 regex

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

this is a [sample] string with [some] special words. [another one]
Run Code Online (Sandbox Code Playgroud)

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

sample
some
another one
Run Code Online (Sandbox Code Playgroud)

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

cod*_*ict 679

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

\[(.*?)\]
Run Code Online (Sandbox Code Playgroud)

说明:

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

  • 如何从输出(结果)中排除`[``]`? (162认同)
  • 这仅匹配第一次出现 (19认同)
  • @MickeyTin,如果你使用Java,你可以使用group(1)对group()进行分组,所以'[]'不会一起使用 (7认同)
  • 另一个答案的方法,使用`[^]]`比非贪婪(`?`)更快,并且也适用于不支持非贪婪的正则表达式.然而,非贪婪看起来更好. (6认同)
  • 如何从退货中排除括号? (6认同)

Ada*_*ski 94

(?<=\[).+?(?=\])
Run Code Online (Sandbox Code Playgroud)

将无需括号捕获内容

  • (?<=\[) - 正面的背后隐藏 [

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

  • (?=\]) - 积极前瞻 ]

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

(\[(?:\[??[^\[]*?\]))
Run Code Online (Sandbox Code Playgroud)

  • @igaurav我已经检查过了,它确实有效.然而,在不支持Javascript等外观的环境中,它将无法工作.也许这是你的情况? (3认同)
  • 这应该是可接受的答案,因为询问者指定了不带括号的输出。当前接受的答案将返回 `[ '[sample]', '[some]', '[another one]' ]`,而此答案返回 `[ 'sample', 'some', 'another one' ]`。 (3认同)
  • 写这些正则表达式的人都是该死的魔术师。太感谢了! (2认同)

jas*_*bar 84

这应该没问题:

\[([^]]+)\]
Run Code Online (Sandbox Code Playgroud)

  • 我认为它没有按预期工作,你应该使用`\ [([^\[\]]*)\]`来获取最内部括号中的内容.如果你研究`lfjlksd [ded [ee] 22]`那么`\ [([^]] +)\]`会得到你`[ded [ee]`,而建议的表达式会返回`[ee]`.testede在[link](http://regexpal.com/) (8认同)
  • 在我的用例中,括号内的文本可能包含新行,并且此正则表达式有效,而接受的答案则不然. (4认同)
  • @Richard,^否定了字符类.它意味着"任何不是a的角色". (3认同)
  • 您能否提供“sed”和“awk”示例以使用此正则表达式并提取文本。谢谢。 (2认同)

Tim*_*ker 32

括号可以嵌套吗?

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

(?<=\[)[^]]+(?=\])
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*ski 11

@Tim Pietzcker 的回答在这里

(?<=\[)[^]]+(?=\])
Run Code Online (Sandbox Code Playgroud)

几乎就是我一直在寻找的那个。但有一个问题是,某些旧版浏览器可能会在积极的后向查找方面失败。所以我必须自己度过这一天:)。我设法写了这个:

/([^[]+(?=]))/g
Run Code Online (Sandbox Code Playgroud)

也许它会对某人有所帮助。


小智 10

(?<=\[).*?(?=\])根据上面给出的解释,效果很好.这是一个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'"
Run Code Online (Sandbox Code Playgroud)


Emm*_*mma 10

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

\[(([^\]\[]+)|(?R))*+\]
Run Code Online (Sandbox Code Playgroud)

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

正则表达式演示 1


除此之外,

\[([^\]\[\r\n]*)\]
Run Code Online (Sandbox Code Playgroud)

正则表达式演示 2

或者,

(?<=\[)[^\]\[\r\n]*(?=\])
Run Code Online (Sandbox Code Playgroud)

正则表达式演示 3

是探索的好选择。


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


正则表达式电路

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

在此处输入图片说明

测试

来源

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


Wik*_*żew 8

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

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

请参阅正则表达式演示正则表达式演示 #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#, etc.), ICU (R stringr), JGSoft Software
    • \[([^][]*)]- Bash , Golang -用一对未转义的括号捕获方括号之间的内容,另见下文
    • \[([^\][]*)]- JavaScript , C++std::regex , VBARegExp
    • (?<=\[)[^\]\[]*(?=]) - Java 正则表达式
    • (?<=\[)[^\]\[]*(?=\]) - Onigmo(Ruby,需要到处转义括号)

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

当两种环视支持都可用时,上述解决方案依靠它们来排除前导/尾随打开/关闭支架。否则,依靠捕获组(已提供指向某些语言的最常见解决方案的链接)。

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


Bal*_*aji 6

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

(\[[a-z]*\])
Run Code Online (Sandbox Code Playgroud)

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

(\[[a-zA-Z]*\]) 
Run Code Online (Sandbox Code Playgroud)

如果您想要小型大写字母和数字字母 a-zA-Z0-9

(\[[a-zA-Z0-9]*\]) 
Run Code Online (Sandbox Code Playgroud)

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

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

(\[.*\])
Run Code Online (Sandbox Code Playgroud)


LJ *_*ain 5

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

让我们分解一下

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

向前看积极(?=)

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

A(?=B)

向后看积极(?<=)

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

(?<=B)A

另类

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

此正则表达式如何工作?

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


归档时间:

查看次数:

492971 次

最近记录:

5 年,10 月 前