我想写一个正则表达式,这样我只匹配第一个不被方括号括起来的数字。
例如asdadsas,*&(*&(*2asdasd*U(*&*()&(*3
应该匹配 2(没有方括号)
并且asdadsas,*&(*&(*[2]asdasd*U(*&*()&(*3
应该匹配 3
我到目前为止的正则表达式是:(?<!\[)[0-9](?!\])
但是,我遇到的问题是它[2
仍然应该匹配 2。
我只想跳过[
左侧和]
右侧的数字。
我不知道如何(或者甚至可能)在正则表达式中实现这种条件逻辑。
我想写一个正则表达式,这样我只匹配第一个不被方括号括起来的数字。
例如asdadsas,*&(*&(*2asdasd*U(*&*()&(*3
应该匹配 2(没有方括号)
并且asdadsas,*&(*&(*[2]asdasd*U(*&*()&(*3
应该匹配 3
我到目前为止的正则表达式是:(?<!\[)[0-9](?!\])
但是,我遇到的问题是它[2
仍然应该匹配 2。
我只想跳过[
左侧和]
右侧的数字。
我不知道如何(或者甚至可能)在正则表达式中实现这种条件逻辑。
以下应该有效:
[0-9](?!(?<=\[.)\])
示例:http ://rubular.com/r/0vKy8hyMy0
说明:[0-9]
匹配一个数字,(?!(?<=\[.)\])
强制要求该数字之前和之后的字符分别不是[
和]
。要打破这一点,请考虑以下正则表达式:
(?<=\[.)\]
这可以读作“匹配 a ]
,但前提是两个地方之前的字符是 a [
”。通过在我们匹配数字后将其放入负前瞻中,如果两个位置前的字符是 a[
并且下一个字符是 a ,我们可能会失败]
。
仅正则表达式的解决方案将是矫枉过正
只需使用(^|\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;
(?! # 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
这将捕获数字作为反向引用。如果您需要数字完全匹配,您可以使用前瞻。
尝试使用环视和交替。这匹配前面没有的[
数字或后面没有的数字]
:
(?<!\[)\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">