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

时间:2010-03-08 17:11:34

标签: regex

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

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

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

sample
some
another one

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

16 个答案:

答案 0 :(得分:622)

您可以使用以下正则表达全球

\[(.*?)\]

说明:

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

答案 1 :(得分:81)

这应该可行:

\[([^]]+)\]

答案 2 :(得分:76)

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

将捕获不带括号的内容

  • (?<=\[) - [的正面观察

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

  • (?=\]) - ]的正面预测

编辑:对于嵌套括号,以下正则表达式应该起作用:

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

答案 3 :(得分:32)

括号可以嵌套吗?

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

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

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

答案 4 :(得分:9)

根据上面给出的解释,

(?<=\().*?(?=\))效果很好。这是一个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'"

答案 5 :(得分:3)

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

以上解释如上所述

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

  • \ s指定空格

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

答案 6 :(得分: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

答案 7 :(得分:3)

要匹配 first [ last ] 之间的子字符串,可以使用

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

请参阅regex demoregex demo #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软件
    • \[([^][]*)]-BashGolang-捕获方括号之间的内容并带有一对未转义的括号,另请参见下文
    • \[([^\][]*)]-JavaScriptC++ std::regexVBA RegExp
    • (?<=\[)[^\]\[]*(?=])-Java正则表达式
    • (?<=\[)[^\]\[]*(?=\])-Onigmo(Ruby,要求到处都转义括号)

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

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

如果需要匹配嵌套括号,您可能会在Regular expression to match balanced parentheses线程中看到解决方案,并用方括号替换了方括号以获取必要的功能。您应该使用捕获组来访问内容,但不包括打开/关闭括号:

答案 8 :(得分:2)

在R中,尝试:

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

答案 9 :(得分:2)

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

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

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

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

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

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

如果您希望方括号之间的所有内容

如果您需要文本,数字和符号

(\[.*\])

答案 10 :(得分:2)

以防万一,您可能有unbalanced brackets,可以设计类似递归的表达式,

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

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

RegEx Demo 1


除此之外,

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

RegEx Demo 2

或者

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

RegEx Demo 3

是探索的好选择。


如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。


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

来源

Regular expression to match balanced parentheses

答案 11 :(得分:2)

@Tim Pietzcker的答案here

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

几乎是我一直在寻找的那个。但是,存在一个问题,即某些旧版浏览器可能无法正常运行。 因此,我不得不独自度过一天:)。我想写这个:

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

也许会帮助某人。

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

答案 12 :(得分:1)

我需要添加换行符和方括号

\[[\s\S]+\]

答案 13 :(得分:0)

这是使用JS完成的方法:

"this is a [sample] string with [some] special words. [another one]".replace(/\[(.*?)\]/gi, "$1")

这将产生以下字符串:

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

答案 14 :(得分:0)

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

让我们分解一下

.匹配除行终止符之外的任何字符。 ?=正向超前。当某个字符串后面有正字符串时,正向查找将查找该字符串。 ?<=正向后方。当某个字符串位于字符串之后时,正向后方查找字符串。引用this

  

向前看积极(?=)

     

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

     

A(?=B)

     

落后于肯定(?<=)

     

查找表达式A,其中表达式B   之前:

     

(?<=B)A

替代方案

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

此正则表达式如何工作?

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

答案 15 :(得分:0)

如果有人想匹配并选择一个包含方括号内的一个或多个点的字符串,例如“ [fu.bar] ”,请使用以下命令:

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

Regex Tester