我想通过这个正则表达式获得 1 级降价标题
/^\#[^\#]\s*(.+?)\s*\#*\n+/m
这是输入:
##Invalid##
#Valid#
##Invalid
#Valid
我期待这个:Valid
但我得到这个:alid
。我的正则表达式有什么问题?
我想通过这个正则表达式获得 1 级降价标题
/^\#[^\#]\s*(.+?)\s*\#*\n+/m
这是输入:
##Invalid##
#Valid#
##Invalid
#Valid
我期待这个:Valid
但我得到这个:alid
。我的正则表达式有什么问题?
我想你的表达方式可能过于复杂。
以下匹配一行的开头,然后是一个#
字符,然后是除字符之外的任何#
字符,然后可选地匹配一个#
,然后是行尾。
^\#([^\#]+)\#?$
##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
[^\#]
会吃一个不是的字符#
。在你的情况下,这就是你的V
性格。
如果您的正则表达式引擎支持前瞻,您可能可以使用它来确定首字母之后的下一个字符是否#
是空格(不要包含在可识别的标题文本或除 a 之外的任何其他内容中(务必包含在已#
识别的标题文本中)。
否则,可能更简单的方法很可能是在捕获组中包含空格,然后在您的宿主语言中修剪字符串:
/^\#((?:\s|[^\#]).*?)\s*\#*\n+/m
#
一旦找到空格或非散列符号(两者都包含在捕获组中),这将考虑完成初始系列的符号。(请注意,我使用的(?:)
是内部非捕获组的语法,对于您的特定正则表达式引擎,这可能看起来不同)。然后,内部文本的剩余字符将像您的表达式一样被收集。
正如 OR Mapper 所说的那样[^\#]
,V
你可以使用这样的东西来代替:
(^|[^#])#\s*([^#]+?)\s*(#($|\r?\n)|($|\r?\n))
第 2 组将包含内部文本
这个正则表达式怎么样:
^#([^#]*)#?$
如果你想去掉空格:
^#\s*([^#]*?)\s*#?$