问题描述
我正在尝试(从字符串中)提取两个\r\n
表达式之间不包含空格的所有字符块。为此,我正在使用负超前运算符。
这是我的字符串:
my_string <- "\r\nContent: base64\r\n\r\nDBhHB\r\nDGlV\r\nPAAHJ\r\nAwQU\r\n"
这就是我尝试过的:
pat <- "\\r\\n+(?! )\\r\\n.*"
out <- unlist(regmatches(my_string,regexpr(pat,my_string,perl=TRUE)))
这就是我在R中得到的:
> out
[1] "\r\n\r\nDBhHB\r\n"
如您所见,它在第一个比赛中停止。
编辑
> out
[1] "DBhHB\r\nDGlV\r\nPAAHJ\r\nAwQU\r\n"
如果字符串中间的其他块中还有一个或两个空格,我希望能够检索多个部分。
my_string <- "\r\nNot This\r\n\r\KeepThis\r\nKeepThis\r\nNot This\r\nKeepThis\r\n"
基于R的建议将不胜感激。
谢谢。
解决方法
我建议使用
(?m)^\S+(?:\R\S+)*$
请参见regex demo。详细信息:
-
(?m)
-启用多行模式 -
^
-此锚现在匹配所有行的起始位置 -
\S+
-一个或多个非空白字符 -
(?:\R\S+)*
-零个或多个重复的换行序列,然后是一个或多个非空白字符 -
$
-行尾。
library(stringr)
my_string <- "\r\nContent: base64\r\n\r\nDBhHB\r\nDGlV\r\nPAAHJ\r\nAwQU\r\n"
pat <- "(?m)^\\S+(?:\\R\\S+)*$"
unlist(str_extract_all(my_string,pat))
## => [1] "DBhHB\r\nDGlV\r\nPAAHJ\r\nAwQU"
my_string <- "\r\nNot This\r\n\r\nKeepThis\r\nKeepThis\r\nNot This\r\nKeepThis\r\n"
unlist(str_extract_all(my_string,pat))
## => [1] "KeepThis\r\nKeepThis" "KeepThis"
基本R用法
请注意,在基本R中,使用PCRE引擎,并且在多行模式下($
使用(?m)
时)仅在\n
之前匹配 。由于您有\r\n
行尾,因此不能使用普通的$
来标记行尾。消耗\r
不是一个好主意(\r$
),因为您不想在输出中包含\r
。 您可以使用(*ANYCRLF)
PCRE动词告诉PCRE将CRLF,CR或LF视为行结束序列:
unlist(regmatches(my_string,gregexpr("(*ANYCRLF)(?m)^\\S+(?:\\R\\S+)*$",my_string,perl=TRUE)))
注意(*ANYCRLF)
PCRE动词必须位于正则表达式模式的开头。