正则表达式识别数字,除非被“[”“]括起来

时间:2013-11-08 17:35:05

标签: regex

我想编写一个正则表达式,这样我只匹配没有方括号括起来的第一个数字。

e.g。 asdadsas,*&(*&(*2asdasd*U(*&*()&(*3应匹配2(无方括号)

asdadsas,*&(*&(*[2]asdasd*U(*&*()&(*3应匹配3

我到目前为止的正则表达式是:(?<!\[)[0-9](?!\])

但是,我遇到的问题是[2仍应匹配2。

如果左侧有[而右侧有],我只想跳过该号码。

我不知道如何(或者甚至可能)在正则表达式中实现这种条件逻辑。

5 个答案:

答案 0 :(得分:2)

以下内容应该有效:

[0-9](?!(?<=\[.)\])

示例:http://rubular.com/r/0vKy8hyMy0

说明:[0-9]匹配一个数字,(?!(?<=\[.)\])强制要求该数字前后的字符分别不是[]。要解决这个问题,请考虑以下正则表达式:

(?<=\[.)\]

这可以理解为“匹配],但前提是两个地方之前的字符是[”。通过在我们匹配数字之后将其置于负面预测中,如果前两个字符为[且下一个字符为],则可能会失败。

答案 1 :(得分:0)

正则表达式唯一的解决方案是过度杀伤

只需使用(^|\D)(\d+)($|\D),然后选择符合条件的第一个..

在c#中,你可以这样做

string output=Regex.Matches(input,@"(^|\D)(\d+)(\D|$)")
                   .Cast<Match>()
                   .Where(x=>!(x.Value.StartsWith("[")&& x.Value.EndsWith("]")))
                   .First()
                   .Groups[2]
                   .Value;

答案 2 :(得分:0)

(?!    # start negative lookahead
    \[ # open bracket
    \d # digit (use \d+ if needed)
    \] # close bracket
)      # end negative lookahead
\[     # literal bracket
(\d)   # capture digit
|      # alternation (OR)
(?<!   # start negative lookbehind
\[     # literal bracket
)
(\d)   # capture digit

这将捕获数字作为反向引用。如果您需要数字完全匹配,您可以使用前瞻。

http://rubular.com/r/C8YSRiY1d0

答案 3 :(得分:0)

尝试使用环视和替换。这匹配不在[之前的数字或不在]之后的数字:

(?<!\[)\d|\d(?!\])

为了使用多个数字的数字,您需要添加环视以确保上一个/下一个字符既不是括号也不是数字:

(?<!\[|\d)\d+|\d+(?!\]|\d)

即(使用Ruby;应该在其他地方工作):

>> rex = /(?<!\[|\d)\d+|\d+(?!\]|\d)/
>> "&(*25asdasd*U(*&*()&(*3".match rex #=> #<MatchData "25">
>> "&(*[25asdasd*U(*&*()&(*3".match rex #=> #<MatchData "25">
>> "&(*25]asdasd*U(*&*()&(*3".match rex #=> #<MatchData "25">

>> "&(*[25]asdasd*U(*&*()&(*3".match rex #=> #<MatchData "3">

答案 4 :(得分:0)

我认为应该适合你的最简单的正则表达式是:

(?<!\[)[0-9]+|[0-9]+(?!\])

现场演示:http://www.rubular.com/r/xWXFg7QXZJ