骗子被正则表达式偷走了

时间:2013-08-09 14:14:00

标签: regex

我希望通过此正则表达式获得1级降价标题

/^\#[^\#]\s*(.+?)\s*\#*\n+/m

这是输入:

##Invalid##

#Valid#

##Invalid

#Valid

我希望如此:Valid但我得到了这个:alid。 我的正则表达式有什么问题?

4 个答案:

答案 0 :(得分:1)

我认为你的表达可能过于复杂。

以下匹配行的开头,然后匹配一个#字符,然后匹配#个字符,然后可选地匹配一个#,然后匹配行的结尾。

^\#([^\#]+)\#?$

REY

输出

##Invalid## => No Match
#Valid#     => #(Valid)#
##Invalid   => No Match
#Valid      => #(Valid)
#Invalid##  => No Match

如果您确实不想要组中的外部空格,可以使用以下表达式在#字符和组之间添加可选空格:

^\#\s*([^\s\#]+)\s*\#?$ 

输出

##Invalid##     => No Match
#Valid#         => #(Valid)#
##Invalid       => No Match
#Valid          => #(Valid)
#Invalid##      => No Match
#  Valid  #     => #  (Valid)  #
#  In Valid?  # => No Match

答案 1 :(得分:0)

[^\#]会吃一个不是#的字符。在您的情况下,这是您的V字符。

如果您的正则表达式引擎支持预读,您可以使用它来确定初始#之后的下一个字符是否为空格(不包括在已识别的标题文本中或除了{之外的任何其他内容) {1}}(包括在公认的标题文字中)。

否则,可能更容易的方法很可能是在捕获组中包含空格,然后在宿主语言中修剪字符串

#

一旦找到空白或非散列符号(两者都包含在捕获组中),这将考虑完成/^\#((?:\s|[^\#]).*?)\s*\#*\n+/m 符号的初始序列。 (请注意,我正在使用内部非捕获组的#语法,这对于您的特定正则表达式引擎可能看起来不同。然后将在表达式中收集内部文本的剩余字符。

答案 2 :(得分:0)

正如O. R. Mapper所说[^\#]正在窃取V,你可以使用这样的东西:

(^|[^#])#\s*([^#]+?)\s*(#($|\r?\n)|($|\r?\n))

第2组将包含内部文本

RegExr

答案 3 :(得分:0)

这个正则表达式如何:

^#([^#]*)#?$

如果你想剥去空格:

^#\s*([^#]*?)\s*#?$