R中的负前行匹配不包含特定字符的字符串中的定界块

问题描述

我正在尝试(从字符串中)提取两个\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+)*-零个或多个重复的换行序列,然后是一个或多个非空白字符
  • $-行尾。

R demo

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动词必须位于正则表达式模式的开头。

请参见this R demo online

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...