我正在尝试捕获位于某个分隔符之间的文本(任何文本),每个分隔符都有字边界,如下所示:
这不是文字。 ##这是我要捕获的文本。##这也不是文本。 ##但我也想抓住这个##。
我认为像这样的正则表达式会很容易
\b([#]{2})(.*)(\1)\b
这不会产生匹配,我无法理解为什么。
注意,我还想避免在第一个'##'和最后一个'##'之间捕获文本,捕获两个部分,其中包含所有文本。
换句话说,我不希望其中一个比赛是:
##这是我要捕获的文本。##这也不是文本。 ##但我也想抓住这个##
答案 0 :(得分:2)
georg和Ulugbek Umirov在这个问题上发表了完整的答案作为评论。我在这里重复一下这里的解释主要是为了给问题一个答案,然后将其从未答复的问题列表中删除。
##\b(.+?)##
搜索字符串
##
和由于括号,##
之间的字符串被标记为反向引用。
?
乘数后面的问号+
会将匹配行为从贪婪变为非贪婪。贪婪的表达式.+
匹配从第一个##
到最后一个##
的所有内容,而非贪婪的表达式.+?
只匹配从第一个##
到下一个##
的所有内容}。
\b
表示单词边界,因此##
之后的第一个字符必须是单词字符(字母,数字或下划线)。
.
的匹配行为取决于标志。点可以匹配任何字符,包括行终止字符,或除行终止字符之外的任何字符。行终止字符是回车符(= \ r = CR)和换行符(=换行符= \ n = LF)。
如果匹配两个分隔符字符串之间的所有内容应该与点的匹配行为无关,那么最好使用正则表达式##\b([\w\W]+?)##
,如Ulugbek Umirov建议\w
匹配任何单词字符和\W
匹配任何非单词字符。因此,字符类定义中的两个都匹配任何字符,包括CR和LF。
也可以使用##\b([\s\S]+?)##
\s
匹配任何空白字符,\S
匹配任何非空格字符,在字符类定义中匹配任何字符(包括CR)和LF也是。
此外,如果点的匹配行为是任何字符,则可以使用##(\w[\s\S]*?)##
或##\w([\w\W]*?)##
或##(\w.*?)##
导致与上述所有其他表达式相同的匹配行为CR + LF。
最后,如果使用的正则表达式引擎支持lookbehind和lookahead,那么通过使用例如正则表达式##
,也可以仅匹配(?<=##)\b[\w\W]+?(?=##)
之间的字符串而不匹配分隔符不需要标记组的需要。 (?<=##)
是一个积极的外观表达式,(?=##)
是字符串##
的正向前瞻性表达。