全栈范

互联网 & 技术 & 产品 & 阅读 & 生活

0%

踩坑记录:使用正则表达式匹配满足指定开头字符串的坑

踩坑记录:使用正则表达式匹配满足指定开头字符串的坑

大致目的是使用正则表达式提取 Markdown 文本的标题。

正则表达式定义如下,

1
val TITLE_PATTERN: Pattern = Pattern.compile("^(#+)(.*)")

即匹配以 ‘#’ 或者多个 ‘#’ 开头的字符串。

其他代码如下,

1
2
3
4
5
val matcher: Matcher = TITLE_PATTERN.matcher(withoutHeader)
while (matcher.find()) {
val title: String = matcher.group()
// ...
}

但是会发现无法匹配到满足条件的字符串(正则表达式验证过没用问题)。

原因是使用正则表达式的时候需要增加一个参数,

1
val TITLE_PATTERN: Pattern = Pattern.compile("^(#+)(.*)", MULTILINE)

其注释如下,

1
2
3
4
5
6
7
8
9
10
11
12
/**
* Enables multiline mode.
*
* <p> In multiline mode the expressions <tt>^</tt> and <tt>$</tt> match
* just after or just before, respectively, a line terminator or the end of
* the input sequence. By default these expressions only match at the
* beginning and the end of the entire input sequence.
*
* <p> Multiline mode can also be enabled via the embedded flag
* expression&nbsp;<tt>(?m)</tt>. </p>
*/
public static final int MULTILINE = 0x08;

就是说,需要使用 MULTILINE 这个参数声明 ^ (匹配开头) 和 $(匹配结尾)对每一行进行匹配,否则是对整个文本进行匹配。

需要注意的是只有使用 ^$ 的时候才需要增加这个参数,如果不限制字符串开头和结尾,不使用这个参数一样可以从整个文本中提取出满足条件的字符串。


-----本文结束 感谢阅读---------

欢迎关注我的其它发布渠道