6

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

例如asdadsas,*&(*&(*2asdasd*U(*&*()&(*3应该匹配 2(没有方括号)

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

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

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

我只想跳过[左侧和]右侧的数字。

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

4

5 回答 5

2

以下应该有效:

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

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

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

(?<=\[.)\]

这可以读作“匹配 a ],但前提是两个地方之前的字符是 a [”。通过在我们匹配数字后将其放入负前瞻中,如果两个位置前的字符是 a[并且下一个字符是 a ,我们可能会失败]

于 2013-11-08T17:42:55.623 回答
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;
于 2013-11-08T17:38:42.033 回答
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

于 2013-11-08T17:42:15.803 回答
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">
于 2013-11-08T17:45:32.360 回答
0

我相信最适合您的正则表达式是:

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

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

于 2013-11-08T17:53:38.463 回答