正则表达式:获取一个未跟在数字后面的字符

3

如果没有数字,我怎么获取第一个字符:

我需要查找所有出现'['的地方且之后没有数字的情况。

例如:

[abc] pass
[cxvjk234] pass
[123] fail

现在,我有这个:

((([[])([^0-9])))

它获取了前两个字符,而我只需要一个。

([[])?为什么不直接用\[呢? - Marc B
1
使用 @"(?<=\[)\D" - Wiktor Stribiżew
1
请您检查一下我们的答案,看看是否对您有用?您的描述有点不清楚。 - Wiktor Stribiżew
4个回答

2

通常情况下,要匹配一些不跟数字的模式,您需要在表达式中添加一个 (?!\d) / (?![0-9]) 负向预查

\[(?!\d)
\[(?![0-9])
  ^^^^^^^^^

请查看正则表达式演示。它匹配任何不紧接着数字的[符号。
你当前的正则表达式模式带有过多捕获组,如果我们去掉冗余的部分,它看起来像是(\[)([^0-9]) - 它匹配一个[然后是一个ASCII数字以外的字符。
你可以使用:
(?<=\[)\D

或者(如果您只想在模式中匹配ASCII数字)
(?<=\[)[^0-9]

请查看正则表达式演示
细节如下:
  • (?<=\[) - 正向后行断言,要求在当前位置之前有一个[字符(但不包括这个字符)...
  • \D / [^0-9] - 非数字。注意:如果只想排除ASCII数字,则可以使用带有RegexOptions.ECMAScript标志的\D

0

也许你正在寻找的是 \[([^0-9]),你期望 [123abc] 能通过吗?


0

一个可能的解决方案是:

\[\D[^]]*\]
# look for [
# \D - not a digit
# anything not ], zero or more times
# followed by ]

请查看在regex101.com上的演示


0

不要使用太多的括号。括号既是分组符,也决定了返回匹配的内容。

\[([^0-9])

如果你绝对需要使用括号,可以使用(?:...)来表示分组但不作为匹配结果的一部分。

(?:(?:(?:\[)([^0-9])))

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