【发布时间】:2020-12-23 07:52:40
【问题描述】:
我正在尝试(从字符串中)提取两个不包含空格的 \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 方法的建议。
提前致谢。
【问题讨论】:
-
为了可读性和测试,我强烈建议缩短您的示例以使其更具可读性和清晰性,同时也说明“如果其他部分中还有一个或两个空格,则检索多个部分”的复杂性字符串中间的块”。如果输入是
my_string <- "\r\nBad Has Spaces\r\n\r\nKeepThis\r\nKeepThisToo\r\nNot This\r\nChunk2a\r\nChunk2b",您的预期输出是什么? -
至于解决方案,当您想在匹配后检查某些内容时,使用前瞻。但是您希望匹配中没有空格,而不是匹配后没有空格。我建议尝试 `pat = "\\r\\n[^]+\\r\\n"。在这种情况下,匹配的贪婪本性应该会让你获得最大的匹配。
-
感谢@Gregor Thomas。我已经编辑了文本。关于您的其他建议,它确实适用于第一个示例,但当其他块中有多个空白时则无效。我会努力工作,看看我得到了什么。再次感谢
-
类似regex101.com/r/hlrbQJ/1?或者,
(?m)^\S+(?:\R\S+)*$(demo)? -
@allanvc 多么烦人,PCRE 库没有使用
PCRE_BSR_ANYCRLF选项编译。我用基本 R 解决方案更新了答案。
标签: r regex regex-lookarounds regex-negation