正则表达式匹配> 123并拒绝>> 123

时间:2015-09-11 21:41:57

标签: regex

我正在编写一个类来解析一个项目真正小的降价式语言。 语法说>123>Text是块引用,而>>123(仅数字)是一种特殊的链接。

问题是,我的正则表达式匹配> 123和>> 123。我正在尝试构建两个只匹配自己语法的表达式,并拒绝另一个。

仅匹配特殊链接,捕获号码:

/>>(\d+)/gi

>>123      [MATCH]
>>Text     [NO MATCH]
>123       [NO MATCH]
>Text      [NO MATCH]

Works like it should.

仅匹配blockquote,捕获文本/数字:

/[^>]>(.*)/gi
>>123     [NO MATCH - I don't know why!]
>>Text    [MATCH - Shouldn't]
>123      [MATCH - OK]
>Text     [MATCH - OK]

Doesn't works.

上一个例子的预期结果:

>>123    [NO MATCH]
>>Text   [NO MATCH]
>123     [MATCH]
>Text    [MATCH]

如何构建它以忽略double>字符并捕获字母数字文本?

3 个答案:

答案 0 :(得分:1)

这可以解决这个问题吗?

(?<=[^>]>)[^>]+\b

https://regex101.com/r/yK5aO4/1

如果您只关心匹配表达式而不是获取字母数字部分,则可以删除lookbehind并以此结束:[^>]>[^>]+\b

答案 1 :(得分:0)

如果您使用Python或PHP,您可以添加一个lookbehind来检查>之前发生的事情。例如,在>之前禁止其他>

(?<!<)<

其中(?<!...)是负向的后观断言,意思是“不在前面”(在后面(或前瞻)中由子模式匹配的内容不会在整个匹配结果中返回。它们只是检查。 )

如果>必须从一行的开头开始,你不需要一个lookbehind,你只能使用一个锚点(标记换行符的位置):

^>[0-9]+

(使用带有Python的re.MULTILINEre.M标志或带有PHP的m修饰符

使用这些元素,您将能够编写自己的模式。

答案 2 :(得分:0)

您可以将正则表达式与起始锚点和multiline(m)标志一起使用:

'/^>([^>]\S*)/'

{{3}}

[^>]是为了确保我们不匹配>>