regex以获取不带/的顶级父目录



查找给定路径/to/filename.ext的正则表达式,我想确定最上面的父路径。

示例:'foo/bar/baz/file.ext''file2.ext''fooz/file3.ext'

应返回"foo"one_answers"fooz">

所使用的语言非常棒。

import java.nio.file.Path
// So given the inputs from the question
def inputs = [
'foo/bar/baz/file.ext',
'file2.ext',
'fooz/file3.ext'
]
def results = inputs.collect {
// Convert each of them to a Path
Path.of(it).with {
// If it has more than 1 element, return the first component
// else return an empty string (it's just a filename)
it.nameCount > 1 ? it.subpath(0, 1).toString() : ''
}
}
// Check results
assert results == ['foo', '', 'fooz']

通常,提取路径名组件的正确方法是使用专门为此设计的工具;在Groovy的情况下,这将是java.nio.file.Path和@tim_yates的答案。

但是询问者要求一个基于正则表达式的解决方案,所以这里有一个:

pat = ~'^[^/]*(?=/)'
for (str in ['foo/bar/baz/file.ext', 'file2.ext', 'fooz/file3.ext']) {
print str + ': '
if (m = str =~ pat) {
println '"'+m[0]+'"'
} else {
println 'NONE'
}
}

哪个输出:

foo/bar/baz/file.ext: "foo"
file2.ext: NONE
fooz/file3.ext: "fooz"

模式^[^/]*匹配从行(^(的开头开始的零个或多个(*(非斜杠字符([^/](的(可能最长的(序列。

这本身就足够了,除了要求像file2.ext这样完全没有斜杠的字符串不匹配。前瞻性断言(?=/)仅在匹配的文本后面跟着斜线时才导致模式匹配。

相关内容

  • 没有找到相关文章

最新更新