ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

sample
some
another one

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


c
codaddict

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

\[(.*?)\]

解释:

\[ : [ 是一个元字符,如果你想从字面上匹配它,需要转义。

(.*?) :以非贪婪的方式匹配所有内容并捕获它。

\] : ] 是一个元字符,如果你想从字面上匹配它,则需要对其进行转义。


另一个答案的方法,使用 [^]] 比非贪婪 (?) 更快,并且也适用于不支持非贪婪的正则表达式风格。但是,非贪婪看起来更好。
如何从输出(结果)中排除 [ ]
@MickeyTin,如果您使用的是 Java,则可以使用 group(1) 而不是 group() 对其进行分组,因此 '[]' 不会放在一起
这仅匹配第一次出现
您如何从退货中排除括号?
m
morepusto
(?<=\[).+?(?=\])

将捕获不带括号的内容

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

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

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

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

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

@igaurav 我已经检查过了,它可以工作。但是,它在不支持像 Javascript 之类的lookbehinds 的环境中不起作用。也许这是你的情况?
亚当,当其中有一个带有 . 的字符串时,您的嵌套括号解决方案将失败......
写这些正则表达式的人你是该死的魔术师。太感谢了!
这应该是公认的答案,因为提问者指定了没有括号的输出。当前接受的答案将返回 [ '[sample]', '[some]', '[another one]' ],而此答案将返回 [ 'sample', 'some', 'another one' ]
并非所有浏览器都支持“正向回溯”功能。
j
jasonbar

这应该可以解决:

\[([^]]+)\]

在我的用例中,括号中的文本可能包含新行,并且此正则表达式有效,而接受的答案则无效。
字符类 [^]] 是什么意思?它匹配什么?
@Richard, ^ 否定字符类。它的意思是“任何不是]的字符”。
我认为它没有按预期工作,您应该使用 \[([^\[\]]*)\] 来获取最内括号中的内容。如果您查看 lfjlksd [ded[ee]22],则 \[([^]]+)\] 将得到 [ded[ee],而建议的表达式将返回 [ee]。在 link 中测试
您能否提供“sed”和“awk”示例以使用此正则表达式并提取文本。谢谢。
T
Tim Pietzcker

括号可以嵌套吗?

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

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

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


@KunalMukherjee:不,正则表达式可以匹配任意次数。但是需要明确告知某些正则表达式风格以重复应用正则表达式(例如,通过在 JavaScript 中使用 /g 标志)。
L
LJ Germain

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

让我们分解一下

. 匹配除行终止符之外的任何字符。 ?= 是一个正向预测。当某个字符串紧随其后时,正向先行会找到一个字符串。 ?<=积极的后视。当某个字符串位于某个字符串之前时,正向向后查找会找到一个字符串。引用 this

正向向前看 (?=) 在表达式 B 后面查找表达式 A:A(?=B) 在正向 (?<=) 后面查找表达式 B 在表达式 B 前面的地方查找表达式 A:(?<=B)A

替代方案

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

这个正则表达式是如何工作的?

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


W
Wiktor Stribiżew

要匹配 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,ICU 正则表达式

\[[^\]\[]*\] - Onigmo(Ruby,需要到处转义括号)

不包括括号:

(?<=\[)[^][]*(?=]) - PCRE, Python re/regex, .NET (C#, etc.), JGSoft Software

\[([^][]*)] - Bash,Golang - 使用一对未转义的括号捕获方括号之间的内容,另见下文

\[([^\][]*)] - JavaScript, C++ std::regex, VBA RegExp

(?<=\[)[^\]\[]*(?=]) - Java 正则表达式,ICU (R stringr)

(?<=\[)[^\]\[]*(?=\]) - Onigmo(Ruby,需要到处转义括号)

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

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

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

\[((?:[^][]++|(?R))*)] - PHP PCRE

\[((?>[^][]+|(?)\[|(?<-o>]))*)] - .NET 演示

\[(?:[^\]\[]++|(\g<0>))*\] - Onigmo (Ruby) 演示


这个 \[((?>[^][]+|(?<o>)\[|(?<-o>]))*)] 是我需要的 99.9%。我的意思是我需要最外面的括号内的所有内容,而不是括号本身。 IE,在您的 .Net 演示链接中,它匹配所有 [text [2]],我希望匹配返回“text [2]”。但是,我可以通过匹配并执行一个跳过第一个和最后一个字符的简单子字符串来解决这个问题。我很好奇是否可以稍微修改该正则表达式以自动省略最外面的括号。
@BOB 您需要获取第 1 组的值,请参阅 the C# demo online
谢谢!我会在我正在使用的演示代码中尝试(在我将它移到实际项目中之前)。编辑:就是这样!感谢专家和异常快速的响应)。
E
Emma

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

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

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

正则表达式演示 1

除此之外,

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

正则表达式演示 2

或者,

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

正则表达式演示 3

是探索的好选择。

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

正则表达式电路

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

https://i.stack.imgur.com/0Q8Qi.png

测试

const 正则表达式 = /\[([^\]\[\r\n]*)\]/gm; const str = `这是一个带有 [some] 特殊单词的 [sample] 字符串。 [另一个] 这是一个带有[一些特殊词的示例字符串。 [another one 这是一个带有 [[some][some]] 特殊词的 [sample[sample]] 字符串。 [[另一个]]`;让 m; while ((m = regex.exec(str)) !== null) { // 这对于避免零宽度匹配的无限循环是必要的 if (m.index === regex.lastIndex) { regex.lastIndex++; } // 可以通过 `m` 变量访问结果。 m.forEach((match, groupIndex) => { console.log(`找到匹配,组 ${groupIndex}: ${match}`); }); }

资源

Regular expression to match balanced parentheses


L
LJ Germain

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

您应该始终对正则表达式使用代码格式,无论它们出现在哪里。如果正则表达式在文本中而不是代码块中,您可以使用反引号来格式化它们。 (ref)
此外,问题是关于方括号 ([]),而不是括号。
M
Michał Grzegorzewski

@Tim Pietzcker 的回答here

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

几乎是我一直在寻找的那个。但是有一个问题是一些旧版浏览器可能会在积极的后视中失败。所以我不得不自己过日子:)。我设法写了这个:

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

也许它会帮助某人。

console.log("这是一个带有 [some] 特殊词的 [sample] 字符串。[another one]".match(/([^[]+(?=]))/g));


我正在寻找的完美答案
光滑的瑞克!很好地很好地使用了运行代码片段来展示它是如何工作的。很好的答案。
N
Nezar Fadle

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

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

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

T
Tony Ladson

在 R 中,尝试:

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

..或 gsub(pat, "\\1", x, perl=TRUE),其中 pat 是您提供的正则表达式..
该解决方案非常出色,它可以“提取”括号内的内容(如果有的话),否则您将获得输入。
ß
ßãlãjî

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

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

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

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

如果你想要小写字母和数字字母 a-zA-Z0-9

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

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

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

(\[.*\])

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

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

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

\s 指定一个空格

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


在敏感情况下,A-Z 应添加到模式中:([[][a-zA-Z \s]+[]]);我认为这是一个好方法,而 \ 在字符串标记( " 和 ' )中定义的正则表达式模式中,并通过 " 或 ' 用法中的反斜杠处理来混合新手!
唯一对我有用的 C++ 正则表达式的答案(除了我用引号而不是括号来做)。 std::regex pattern{R"(["][a-zA-Z \s]+["])"};
c
citynorman

我需要包括换行符和括号

\[[\s\S]+\]


A
Andreas

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

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

Regex Tester