简单的正则表达式问题。我有以下格式的字符串:
this is a [sample] string with [some] special words. [another one]
提取方括号内的单词的正则表达式是什么,即。
sample
some
another one
注意:在我的用例中,括号不能嵌套。
您可以全局使用以下正则表达式:
\[(.*?)\]
解释:
\[ : [ 是一个元字符,如果你想从字面上匹配它,需要转义。
(.*?) :以非贪婪的方式匹配所有内容并捕获它。
\] : ] 是一个元字符,如果你想从字面上匹配它,则需要对其进行转义。
(?<=\[).+?(?=\])
将捕获不带括号的内容
(?<=\[) - 积极向后看 [
.*? - 内容的非贪婪匹配
(?=\]) - 积极前瞻 ]
编辑:对于嵌套括号,下面的正则表达式应该可以工作:
(\[(?:\[??[^\[]*?\]))
.
的字符串时,您的嵌套括号解决方案将失败......
[ '[sample]', '[some]', '[another one]' ]
,而此答案将返回 [ 'sample', 'some', 'another one' ]
。
这应该可以解决:
\[([^]]+)\]
\[([^\[\]]*)\]
来获取最内括号中的内容。如果您查看 lfjlksd [ded[ee]22]
,则 \[([^]]+)\]
将得到 [ded[ee]
,而建议的表达式将返回 [ee]
。在 link 中测试
括号可以嵌套吗?
如果不是:\[([^]]+)\]
匹配一项,包括方括号。反向引用 \1
将包含要匹配的项目。如果您的正则表达式风格支持环视,请使用
(?<=\[)[^]]+(?=\])
这只会匹配括号内的项目。
/g
标志)。
如果您不想在匹配中包含方括号,请使用正则表达式:(?<=\[).*?(?=\])
让我们分解一下
.
匹配除行终止符之外的任何字符。 ?=
是一个正向预测。当某个字符串紧随其后时,正向先行会找到一个字符串。 ?<=
是积极的后视。当某个字符串位于某个字符串之前时,正向向后查找会找到一个字符串。引用 this,
正向向前看 (?=) 在表达式 B 后面查找表达式 A:A(?=B) 在正向 (?<=) 后面查找表达式 B 在表达式 B 前面的地方查找表达式 A:(?<=B)A
替代方案
如果您的正则表达式引擎不支持前瞻和后瞻,那么您可以使用正则表达式 \[(.*?)\]
来捕获组中括号的内部信息,然后您可以根据需要操作该组。
这个正则表达式是如何工作的?
括号捕获组中的字符。 .*?
以不贪婪的方式获取括号之间的所有字符(行终止符除外,除非您启用了 s
标志)。
要匹配 first [
和 last ]
之间的子字符串 ,您可以使用
\[.*\] # Including open/close brackets
\[(.*)\] # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\]) # Excluding open/close brackets (using lookarounds)
请参阅 regex demo 和 regex 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
\[((?>[^][]+|(?
\[(?:[^\]\[]++|(\g<0>))*\] - Onigmo (Ruby) 演示
\[((?>[^][]+|(?<o>)\[|(?<-o>]))*)]
是我需要的 99.9%。我的意思是我需要最外面的括号内的所有内容,而不是括号本身。 IE,在您的 .Net 演示链接中,它匹配所有 [text [2]],我希望匹配返回“text [2]”。但是,我可以通过匹配并执行一个跳过第一个和最后一个字符的简单子字符串来解决这个问题。我很好奇是否可以稍微修改该正则表达式以自动省略最外面的括号。
以防万一,您可能有 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
(?<=\[).*?(?=\])
按照上面给出的解释效果很好。这是一个 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'"
[]
),而不是括号。
@Tim Pietzcker 的回答here
(?<=\[)[^]]+(?=\])
几乎是我一直在寻找的那个。但是有一个问题是一些旧版浏览器可能会在积极的后视中失败。所以我不得不自己过日子:)。我设法写了这个:
/([^[]+(?=]))/g
也许它会帮助某人。
console.log("这是一个带有 [some] 特殊词的 [sample] 字符串。[another one]".match(/([^[]+(?=]))/g));
此代码将提取方括号和括号之间的内容
(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))
(?: 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
在 R 中,尝试:
x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
gsub(pat, "\\1", x, perl=TRUE)
,其中 pat
是您提供的正则表达式..
如果您只想在方括号 az 之间填充小字母
(\[[a-z]*\])
如果你想要小写和大写字母 a-zA-Z
(\[[a-zA-Z]*\])
如果你想要小写字母和数字字母 a-zA-Z0-9
(\[[a-zA-Z0-9]*\])
如果你想要方括号之间的所有内容
如果你想要文字、数字和符号
(\[.*\])
([[][a-z \s]+[]])
上面应该工作给出以下解释
方括号[] 中的字符定义了 characte 类,这意味着模式应该与方括号中提到的至少一个字符匹配
\s 指定一个空格
表示前面提到的字符中的至少一个 +。
A-Z
应添加到模式中:([[][a-zA-Z \s]+[]])
;我认为这是一个好方法,而 \
在字符串标记( " 和 ' )中定义的正则表达式模式中,并通过 " 或 ' 用法中的反斜杠处理来混合新手!
std::regex pattern{R"(["][a-zA-Z \s]+["])"};
我需要包括换行符和括号
\[[\s\S]+\]
[^]]
比非贪婪 (?
) 更快,并且也适用于不支持非贪婪的正则表达式风格。但是,非贪婪看起来更好。[
]
?