简单的正则表达式问题。我有一个字符串的以下格式:
this is a [sample] string with [some] special words. [another one]
提取方括号内的单词的正则表达式是什么?
sample
some
another one
注意:在我的用例中,括号不能嵌套。
简单的正则表达式问题。我有一个字符串的以下格式:
this is a [sample] string with [some] special words. [another one]
提取方括号内的单词的正则表达式是什么?
sample
some
another one
注意:在我的用例中,括号不能嵌套。
括号可以嵌套吗?
如果不是:\[([^]]+)\]匹配一个项目,包括方括号。反向引用\1将包含要匹配的项。如果你的正则表达式口味支持搜索,请使用
(?<=\[)[^]]+(?=\])
这将只匹配括号内的项。
你可以全局使用以下正则表达式:
\[(.*?)\]
解释:
\[:[是一个元字符,如果你想字面上匹配它,就需要转义。 (.*?):以非贪婪的方式匹配所有内容并捕获它。 \]:]是一个元字符,如果你想字面上匹配它,就需要转义。
([[][a-z \s]+[]])
根据以下解释,上述方法应该有效
方括号[]内的字符定义了字符类,这意味着模式应该匹配方括号内提到的至少一个字符 \s指定一个空格 +表示前面提到的至少一个字符为+。
(?<=\[).+?(?=\])
将捕获没有括号的内容
(?<=\[) -[的正向回溯 . * ?-非贪婪匹配的内容 (?=\]) -正向预测]
编辑:对于嵌套括号,下面的正则表达式应该工作:
(\[(?:\[??[^\[]*?\]))
这段代码将提取方括号和圆括号之间的内容
(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))
(?: 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
(?<=\[).*?(?=\])根据上述解释工作良好。下面是一个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'"
如果你不想在匹配中包含括号,下面是正则表达式:(?<=\[).*?(?=\])
让我们来分析一下
的。匹配除行结束符以外的任何字符。?=是一个正面的前瞻。当某个字符串跟在某个字符串后面时,正向向前查找该字符串。<=是一个正向的后视。当某个字符串位于某个字符串的前面时,正向向后查找查找该字符串。引用一下,
积极地向前看(?=) 在表达式B后面找到表达式A: (? = B) 正面看后面(?<=) 在表达式B中找到表达式A 之前: (? < = B)
另一种选择
如果您的正则表达式引擎不支持头视和后视,那么您可以使用正则表达式\[(.*?)\]来捕获组中括号的内部结构,然后您可以根据需要操作组。
这个正则表达式是如何工作的?
括号捕获组中的字符。. * ?以非贪婪的方式获取括号之间的所有字符(行结束符除外,除非启用了s标志)。
如果你想要填充方括号a-z之间的小字母
(\[[a-z]*\])
如果你想要小写字母a-zA-Z
(\[[a-zA-Z]*\])
如果你想要小写字母和数字字母a-zA-Z0-9
(\[[a-zA-Z0-9]*\])
如果你想要所有在方括号之间的东西
如果你想要文字,数字和符号
(\[.*\])
以防万一,你可能有不平衡的括号,你可能会设计一些递归的表达式,
\[(([^\]\[]+)|(?R))*+\]
当然,这与你可能使用的语言或RegEx引擎有关。
RegEx演示1
除此之外,
\[([^\]\[\r\n]*)\]
RegEx演示2
or,
(?<=\[)[^\]\[\r\n]*(?=\])
RegEx演示3
都是很好的选择。
如果您希望简化/修改/探索表达式,regex101.com的右上方面板中有解释。如果你愿意,你也可以在这个链接中观看,它是如何与一些样本输入匹配的。
RegEx电路
jex。Im可视化正则表达式:
Test
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}`); }); }
源
匹配平衡括号的正则表达式
要匹配第一个[和最后一个]之间的子字符串,可以使用
\[.*\] # Including open/close brackets
\[(.*)\] # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\]) # Excluding open/close brackets (using lookarounds)
请看一个正则表达式演示和一个正则表达式演示#2。
使用以下表达式来匹配最接近的方括号之间的字符串:
Including the brackets: \[[^][]*] - PCRE, Python re/regex, .NET, Golang, POSIX (grep, sed, bash) \[[^\][]*] - ECMAScript (JavaScript, C++ std::regex, VBA RegExp) \[[^\]\[]*] - Java, ICU regex \[[^\]\[]*\] - Onigmo (Ruby, requires escaping of brackets everywhere) Excluding the brackets: (?<=\[)[^][]*(?=]) - PCRE, Python re/regex, .NET (C#, etc.), JGSoft Software \[([^][]*)] - Bash, Golang - capture the contents between the square brackets with a pair of unescaped parentheses, also see below \[([^\][]*)] - JavaScript, C++ std::regex, VBA RegExp (?<=\[)[^\]\[]*(?=]) - Java regex, ICU (R stringr) (?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby, requires escaping of brackets everywhere)
注意:*匹配0个或更多字符,使用+匹配1个或更多字符以避免在结果列表/数组中匹配空字符串。
只要这两种环视支持都可用,上述解决方案就依赖于它们来排除前导/后导的开/闭括号。否则,依赖于捕获组(提供了一些语言中最常见解决方案的链接)。
如果需要匹配嵌套括号,可以在正则表达式中看到匹配平衡括号线程的解决方案,并将圆括号替换为方括号以获得必要的功能。你应该使用捕获组来访问不包含左/右括号的内容:
\[((?:[^][]++|(? r))*)] - PHP pcre \[((?>[^][]+|(?<o>)\[|(?<-o>]))*) \[(?:[^\]\[]++|(\g<0>))*\] - Onigmo (Ruby) demo
蒂姆·皮茨克的答案在这里
(?<=\[)[^]]+(?=\])
几乎就是我一直在找的人但有一个问题是,一些传统浏览器可能会在正向向后查找时失败。 所以我今天只能靠自己了:)。我设法写下了这些:
/([^[]+(?=]))/g
也许它会帮助别人。
Console.log("这是一个带有[一些]特殊单词的[示例]字符串。(一)“.match (/([^[]+(?=]))/ g));
如果有人想匹配并选择一个在方括号内包含一个或多个圆点的字符串,如“[fu.]”。Bar]"使用以下语句:
(?<=\[)(\w+\.\w+.*?)(?=\])
正则表达式测试器