正则表达式:以 [ 开头,以 ] 结尾。

21

如何使用正则表达式查找以 [ 开头并以 ] 结尾的字符串,中括号内可以包含任意字符。


你是在尝试在一段较长的文本中查找这些字符串吗?如果是,括号是否可以嵌套? - Tim Pietzcker
是的,我正在尝试在一个较大的代码体中查找字符串。但我不希望有嵌套的括号。 - KBBWrite
4个回答

42

[ and ]是正则表达式中的特殊字符,因此您需要对它们进行转义处理。以下代码应该适用于您:

[] 是正则表达式中的特殊字符,所以您需要对它们进行转义处理。这个方法适合你:

\[.*?\]

.*? 匹配任意字符,且为非贪婪模式。非贪婪模式可以确保匹配到 [abc] 而不是 [abc]def]。如果你想要匹配整个字符串,例如在 abc[def]ghi 中没有匹配项,请添加前导的 ^ 和尾随的 $


这不匹配开始和结束,这意味着:包含。 - Poul Bak

14
^\[.*\]$

这将匹配以[开头且以]结尾的字符串。在C#中:

foundMatch = Regex.IsMatch(subjectString, @"^\[.*\]$");

如果你正在查找长字符串中括号包含的字符串(例如,在foo [bar] baz 中查找[bar]),那么请使用:

\[[^[\]]*\]
在C#中:
MatchCollection allMatchResults = null;
Regex regexObj = new Regex(@"\[[^[\]]*\]");
allMatchResults = regexObj.Matches(subjectString);

解释:

\[        # match a literal [
 [^[\]]*  # match zero or more characters except [ or ]
\]        # match a literal ]

我不确定你或thecoop的答案哪个是最好的,但我认为你的答案更好,因为OP从来没有提到在[和]之间应该有任何字符,因此你的*比thecoop的+更适合。 - Bazzz

7

这应该可以工作:

^\[.+\]$

^表示字符串的开头
\[是转义字符,因为[是控制字符
.+匹配所有长度大于等于1的字符串(.表示任意字符,+表示匹配前一个模式一次或多次)
\]是转义字符
$表示字符串的结尾

如果想要匹配[],将+改为*('匹配零个或多个')

然后使用Regex类进行匹配:

bool match = Regex.IsMatch(input, "^\[.+\]$");

如果您需要多次使用此功能或在循环中使用它,请创建一个Regex实例,以提高性能:

private static readonly Regex s_MyRegexPatternThingy = new Regex("^\[.+\]$");

bool match = s_MyRegexPatternThingy.IsMatch(input);

工作表达式是[.*?],不过您的描述也很有帮助。 - KBBWrite

2

如果你想在括号中使用至少一个字符,那么你需要使用转义字符\。如果你想要至少一个字符,可以使用.+;如果你接受这个字符串:[],那么可以使用.*

^\[.*\]$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接