Regex 从字符串中提取两个单词之间的子字符串

Regex 从字符串中提取两个单词之间的子字符串,regex,string,r,substr,Regex,String,R,Substr,我有以下字符串: string = "asflkjsdhlkjsdhglk<body>Iwant\to+extr@ctth!sstr|ng<body>sdgdfsghsghsgh" string=“asflkjsdhlkjsdhglkIwant\to+extr@ctth!sstr | ngsdgdfsghsghsgh“ 我想提取两个标记之间的字符串。我想要的结果是: substring = "<body>Iwant\to+extr@ctth!sstr|ng

我有以下字符串:

string = "asflkjsdhlkjsdhglk<body>Iwant\to+extr@ctth!sstr|ng<body>sdgdfsghsghsgh"
string=“asflkjsdhlkjsdhglkIwant\to+extr@ctth!sstr | ngsdgdfsghsghsgh“
我想提取两个
标记之间的字符串。我想要的结果是:

substring = "<body>Iwant\to+extr@ctth!sstr|ng<body>"
substring=“Iwant\to+extr@ctth!sstr | ng“
请注意,两个
标记之间的子字符串可以包含字母、数字、标点符号和特殊字符

有没有一个简单的方法可以做到这一点?谢谢大家!

strsplit()应该可以帮助您:

>string = "asflkjsdhlkjsdhglk<body>Iwant\to+extr@ctth!sstr|ng<body>sdgdfsghsghsgh"
>x = strsplit(string, '<body>', fixed = FALSE, perl = FALSE, useBytes = FALSE)
[[1]]
[1] "asflkjsdhlkjsdhglk"         "Iwant\to+extr@ctth!sstr|ng" "sdgdfsghsghsgh"  
> x[[1]][2]
[1] "Iwant\to+extr@ctth!sstr|ng"
>string=“asflkjsdhlkjsdhglkIwant\to+extr@ctth!sstr | ngsdgdfsghsghsgh“
>x=strsplit(字符串“”,fixed=FALSE,perl=FALSE,useBytes=FALSE)
[[1]]
[1] “asflkjsdhlkjsdhglk”“Iwant\to”+extr@ctth!sstr | ng“sdgdfsghsghsgh”
>x[[1]][2]
[1] “我想要\to+extr@ctth!sstr | ng“

当然,这将提供字符串的所有三个部分,而不包括标记。

以下是正则表达式的方式:

regmatches(string, regexpr('<body>.+<body>', string))
regmatches(字符串,regexpr('.+',字符串))

我相信马修和史蒂夫的答案都是可以接受的。下面是另一个解决方案:

string=“asflkjsdhlkjsdhglkIwant\to+extr@ctth!sstr | ngsdgdfsghsghsgh“
regmatches(字符串,regexpr('.+',字符串))
输出=sub(“.*(.+).*”,“\\1”,字符串)

打印(输出)
为什么在这里需要perl=TRUE?@Codoremifa您不需要,谢谢。最初,我认为OP想要排除标记,我建议使用前瞻断言,要求使用
perl=TRUE
标志。
perl=TRUE
的一个优点是。@Arun不是开玩笑。谢谢,我不知道。非常感谢。但是您的解决方案中的body标记被排除。我希望它们也能被返回。也许这
[\S\S]*
regex = '<body>.+?<body>'
regex = '(<body>.+?<body>)'