简单的正则表达式问题。我有一个以下格式的字符串:
this is a [sample] string with [some] special words. [another one]
在方括号内提取单词的正则表达式是什么,即
sample
some
another one
注意:在我的用例中,括号不能嵌套。
答案 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)
使用以下表达式在最近方括号之间的字符串匹配:
包括方括号:
\[[^][]*]
-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软件\[([^][]*)]
-Bash,Golang-捕获方括号之间的内容并带有一对未转义的括号,另请参见下文\[([^\][]*)]
-JavaScript,C++ std::regex
,VBA RegExp
(?<=\[)[^\]\[]*(?=])
-Java正则表达式(?<=\[)[^\]\[]*(?=\])
-Onigmo(Ruby,要求到处都转义括号) 注意:*
匹配0个或多个字符,使用+
匹配1个或多个字符,以避免在结果列表/数组中出现空字符串匹配。
只要这两种环视支持均可用,上述解决方案便会依靠它们来排除前导/尾随的打开/关闭支架。否则,请依靠捕获组(已提供某些语言的最常见解决方案的链接)。
如果需要匹配嵌套括号,您可能会在Regular expression to match balanced parentheses线程中看到解决方案,并用方括号替换了方括号以获取必要的功能。您应该使用捕获组来访问内容,但不包括打开/关闭括号:
\[((?:[^][]++|(?R))*)]
-PHP PCRE \[((?>[^][]+|(?<o>)\[|(?<-o>]))*)]
-.NET demo \[(?:[^\]\[]++|(\g<0>))*\]
-Onigmo (Ruby) demo 答案 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引擎有关。
除此之外,
\[([^\]\[\r\n]*)\]
或者
(?<=\[)[^\]\[\r\n]*(?=\])
是探索的好选择。
如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。
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}`);
});
}
答案 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)