Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式捕获之间的任何文本_Regex - Fatal编程技术网

Regex 正则表达式捕获之间的任何文本

Regex 正则表达式捕获之间的任何文本,regex,Regex,我试图捕获位于某类分隔符之间的文本(任何文本),每端都有单词边界,如下所示: 这不是正文##这是我要捕获的文本。##这也不是文本##但我也想捕捉到这一点 我以为这样的正则表达式会很容易 \b([#]{2})(.*)(\1)\b 这并不匹配,我也不明白为什么 注意,我还希望避免捕获第一个“###”和最后一个“##”之间的文本,捕获两个部分时所有文本都在这两个部分之间 换句话说,我不希望其中一个匹配是: ##这是我要捕获的文本。##这也不是文本##但我也想捕捉到这一点## 并发表了关于这个问题的完

我试图捕获位于某类分隔符之间的文本(任何文本),每端都有单词边界,如下所示:

这不是正文##这是我要捕获的文本。##这也不是文本##但我也想捕捉到这一点

我以为这样的正则表达式会很容易

\b([#]{2})(.*)(\1)\b
这并不匹配,我也不明白为什么

注意,我还希望避免捕获第一个“###”和最后一个“##”之间的文本,捕获两个部分时所有文本都在这两个部分之间

换句话说,我不希望其中一个匹配是:

##这是我要捕获的文本。##这也不是文本##但我也想捕捉到这一点##

并发表了关于这个问题的完美答案作为评论。我在这里重复这个表达,并给出解释,主要是为了给这个问题一个答案,从而将其从未回答的问题列表中删除

搜索字符串

  • ##
    开头和结尾,以及
  • 在开头和结尾都有一个单词字符
  • 中间有一个或多个字符的
由于有括号,在
##
之间找到的字符串被标记为反向引用

+
乘数后面的问号
将匹配行为从贪婪更改为非贪婪。贪婪表达式
+
匹配从第一个
##
到最后一个
##
的所有内容,而非贪婪表达式
+?
只匹配从第一个
#
到下一个
##
的所有内容

\b
表示单词边界,因此
#
后面的第一个字符必须是单词字符(字母、数字或下划线)

的匹配行为取决于标志。点可以匹配任何字符,包括行终止字符,或除行终止字符以外的任何字符。行终止字符是回车符(\r=CR)和换行符(=newline=\n=LF)

如果匹配两个分隔符字符串之间的所有内容都应该独立于点的匹配行为,那么最好使用正则表达式
##\b([\w\w]+?)##
,就像建议的那样
\w
匹配任何单词字符而
\w
匹配任何非单词字符。因此,字符类定义中的两个字符始终匹配任何字符,包括CR和LF

也可以使用
##\b([\s\s]+?)##
,其中
\s
匹配任何空白字符,
\s
匹配任何非空白字符,从而在字符类定义中匹配包括CR和LF在内的任何字符

此外,如果点的匹配行为是包括CR+LF在内的任何字符,则可以使用
##(\w[\s]*?)#
###([\w\w]*?)#
##(\w.*)###
都会产生与上述所有其他表达式相同的匹配行为


最后,如果使用的正则表达式引擎支持lookbehind和lookbeahead,那么也可以只匹配
##
之间的字符串,而不匹配分隔符,例如使用正则表达式
(?您可能希望使表达式不贪婪:
##(.+?)##
\b
-单词边界,在
\w
\w
之间的零长度匹配。但是,
空格
都是非单词字符(
\w
),所以
\b
空格和
之间不会匹配。谢谢。这就成功了!