查找给定路径/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
这样完全没有斜杠的字符串不匹配。前瞻性断言(?=/)
仅在匹配的文本后面跟着斜线时才导致模式匹配。