匹配模式和有界字符串的正则表达式
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)
它有效,但它给我留下了两个问题:
- 有没有更好的方法 express/accomplish 在正则表达式中这样做。
- 我该怎么做才能找到第一个/“路径”之前和下一个/“路径”之后的所有内容?
您可以在此处使用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}\/
正则表达式可以分解如下。
(?<=\/) # 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
我正在尝试从文件路径字符串向量中替换(技术上删除)一定级别的文件夹。数据如下所示:
x<-c("d:/KeepItSimple/1234path21/WAVs/filename.wav",
"d:/TryToKeepItSimple/5678path23/WAVs/filename2.wav")
我想使用 gsub
和正则表达式在每个字符串中查找模式“路径”,并将两个正斜杠之间包含“路径”的字符串替换为空。基本上只是删除该文件夹级别。您可以假设命名该文件夹级别的字符数将始终包含“路径”并且始终为 10 个字符长(在斜线之间)。
经过一番摸索,我想到了这个:
gsub(".{4}path.{2}", "", x)
它有效,但它给我留下了两个问题:
- 有没有更好的方法 express/accomplish 在正则表达式中这样做。
- 我该怎么做才能找到第一个/“路径”之前和下一个/“路径”之后的所有内容?
您可以在此处使用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}\/
正则表达式可以分解如下。
(?<=\/) # 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