匹配模式和有界字符串的正则表达式

Regex matching a pattern and bounded strings

我正在尝试从文件路径字符串向量中替换(技术上删除)一定级别的文件夹。数据如下所示:

x<-c("d:/KeepItSimple/1234path21/WAVs/filename.wav",
     "d:/TryToKeepItSimple/5678path23/WAVs/filename2.wav")

我想使用 gsub 和正则表达式在每个字符串中查找模式“路径”,并将两个正斜杠之间包含“路径”的字符串替换为空。基本上只是删除该文件夹级别。您可以假设命名该文件夹级别的字符数将始终包含“路径”并且始终为 10 个字符长(在斜线之间)。

经过一番摸索,我想到了这个:

 gsub(".{4}path.{2}", "", x)

它有效,但它给我留下了两个问题:

  1. 有没有更好的方法 express/accomplish 在正则表达式中这样做。
  2. 我该怎么做才能找到第一个/“路径”之前和下一个/“路径”之后的所有内容?

您可以在此处使用sub,如下所示:

x <- c("d:/KeepItSimple/1234path21/WAVs/filename.wav",
       "d:/TryToKeepItSimple/5678path23/WAVs/filename2.wav")
output <- sub("/?[^/]*path[^/]*/?", "/", x)
output

[1] "d:/KeepItSimple/WAVs/filename.wav"      
[2] "d:/TryToKeepItSimple/WAVs/filename2.wav"

我对题目的理解是,被替换为空字符串的文本必须满足四个条件。它

  • 前面紧接一个正斜杠;
  • 在字符串末尾包含一个正斜杠;
  • 包含11个字符;和
  • 包含字符串“路径”

我们可以用下面的正则表达式来匹配这样一个字符串。

(?<=\/)(?=[^\/\n]{0,6}path)[^\/]{10}\/

Demo

正则表达式可以分解如下。

(?<=\/)         # positive lookbehind asserts match is preceded by a forward slash  
(?=             # begin positive lookahead
  [^\/\n]{0,6}  # match zero to 6 characters other than forward slashes and newlines
  path          # match literal
)               # end positive lookahead
[^\/\n]{10}     # match 10 characters other than forward slashes and newlines 
\/              # match a forward slash