1

我想通过这个正则表达式获得 1 级降价标题

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

这是输入:

##Invalid##

#Valid#

##Invalid

#Valid

我期待这个:Valid但我得到这个:alid。我的正则表达式有什么问题?

4

4 回答 4

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
于 2013-08-09T14:22:13.117 回答
0

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

如果您的正则表达式引擎支持前瞻,您可能可以使用它来确定首字母之后的下一个字符是否#是空格(不要包含在可识别的标题文本或除 a 之外的任何其他内容中(务必包含在已#识别的标题文本中)。

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

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

#一旦找到空格或非散列符号(两者都包含在捕获组中),这将考虑完成初始系列的符号。(请注意,我使用的(?:)是内部非捕获组的语法,对于您的特定正则表达式引擎,这可能看起来不同)。然后,内部文本的剩余字符将像您的表达式一样被收集。

于 2013-08-09T14:15:36.653 回答
0

正如 OR Mapper 所说的那样[^\#]V你可以使用这样的东西来代替:

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

第 2 组将包含内部文本

正则表达式

于 2013-08-09T14:18:55.290 回答
0

这个正则表达式怎么样:

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

如果你想去掉空格:

^#\s*([^#]*?)\s*#?$
于 2013-08-09T14:20:24.243 回答