我想编写一个正则表达式,这样我只匹配没有方括号括起来的第一个数字。
e.g。 asdadsas,*&(*&(*2asdasd*U(*&*()&(*3
应匹配2(无方括号)
和asdadsas,*&(*&(*[2]asdasd*U(*&*()&(*3
应匹配3
我到目前为止的正则表达式是:(?<!\[)[0-9](?!\])
但是,我遇到的问题是[2
仍应匹配2。
如果左侧有[
而右侧有]
,我只想跳过该号码。
我不知道如何(或者甚至可能)在正则表达式中实现这种条件逻辑。
答案 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
这将捕获数字作为反向引用。如果您需要数字完全匹配,您可以使用前瞻。
答案 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)