我希望通过此正则表达式获得1级降价标题
/^\#[^\#]\s*(.+?)\s*\#*\n+/m
这是输入:
##Invalid##
#Valid#
##Invalid
#Valid
我希望如此:Valid
但我得到了这个:alid
。
我的正则表达式有什么问题?
答案 0 :(得分:1)
我认为你的表达可能过于复杂。
以下匹配行的开头,然后匹配一个#
字符,然后匹配#
个字符,然后可选地匹配一个#
,然后匹配行的结尾。
^\#([^\#]+)\#?$
##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组将包含内部文本
答案 3 :(得分:0)
这个正则表达式如何:
^#([^#]*)#?$
如果你想剥去空格:
^#\s*([^#]*?)\s*#?$