我有一个像
这样的字符串txt<-"text text text <div><div><script>xxxx</script></div><scrip>yyyyy</script>text </div><script>zzzzzz</script>"
我想删除所有脚本标记及其内容。
"text text text <div><div></div>text </div>"
我试过了
gsub("<script.*?>(.*)<\\/script>", "", txt)
你能给我们一个很好的教程来学习R
的快速正则表达式提前致谢
答案 0 :(得分:2)
贪婪点匹配的第一次尝试注定要失败,因为贪婪的匹配并不能确保最短的匹配(好吧,懒惰的匹配也不会),而这只会匹配中间所有必要的文本。
使用<script>[^</script>^<script>]+</script>
的最新尝试也无效,因为[^</script>^<script>]+
匹配<
,/
,s
,{{以外的1个或多个字母1}},c
,r
,i
,p
,t
,>
。显然,这不是你需要的。
从问题本身提取,可以处理任何纯文本文件,正则表达式从文本中删除大块。
当我们需要匹配某些不相同的标记(或分隔符)之间的子字符串时,我们可以使用 unroll-the-loop技术和支持 lookaheads 的类似Perl的正则表达式。
以下是适用于任何大小的纯文本的工作代码:
^
regex demo can be seen here,此处为IDEONE demo。
基本上,匹配:
txt<-"text text text <div><div><script>xxxx</script></div><script>yyyyy</script>text </div><script>zzzzzz</script>"
gsub("<script\\b[^<]*>[^<]*(?:<(?!/script>)[^<]*)*</script>", "", txt, perl=T)
## [1] "text text text <div><div></div>text </div>"
- 任何开放<script\\b[^<]*>
标记即使内部属性(不是<script>
)也不会出现在HTML属性中,因此<
比{{1}更安全}}或[^<]*
)[^<>]*
- 展开的[^>]*
构造,匹配任何文字,[^<]*(?:<(?!/script>)[^<]*)*
(?s).*?
- 关闭</script>
代码答案 1 :(得分:0)
我想我找到了它
gsub("<script>[^</script>^<script>]+</script>", "", txt)