jsd*_*rio 16 javascript regex node.js
我正在开发一个MQTT处理程序,我想为每个有一个事件监听器的父目录发出一个事件.例如:
如果有以下MQTT路径可用,那么有下标 - 这些路径的事件侦听器 -
testreplyer/requesttest/replyer/request有人发表主题test/replyer/request/@issuer,应该有2个事件被发现:test,test/replyer/request.
鉴于任何路径都是可能的并且没有可用的有效事件列表,我们必须仅检查路径是否是另一个路径的父路径.我们可以用正则表达式做到这一点吗?如果是这样,它会是什么样子?有更简单/更有效的解决方案吗?
Ily*_*kov 34
让Node本身完成工作.
const path = require('path');
const relative = path.relative(parent, dir);
return relative && !relative.startsWith('..') && !path.isAbsolute(relative);
Run Code Online (Sandbox Code Playgroud)
它也为你做了标准化.
const path = require('path');
const tests = [
['/foo', '/foo'],
['/foo', '/bar'],
['/foo', '/foobar'],
['/foo', '/foo/bar'],
['/foo', '/foo/../bar'],
['/foo', '/foo/./bar'],
['/bar/../foo', '/foo/bar'],
['/foo', './bar'],
['C:\\Foo', 'C:\\Foo\\Bar'],
['C:\\Foo', 'C:\\Bar'],
['C:\\Foo', 'D:\\Foo\\Bar'],
];
tests.forEach(([parent, dir]) => {
const relative = path.relative(parent, dir);
const isSubdir = relative && !relative.startsWith('..') && !path.isAbsolute(relative);
console.log(`[${parent}, ${dir}] => ${isSubdir} (${relative})`);
});
Run Code Online (Sandbox Code Playgroud)
也适用于跨驱动器的Windows.
[/foo, /foo] => false ()
[/foo, /bar] => false (..\bar)
[/foo, /foobar] => false (..\foobar)
[/foo, /foo/bar] => true (bar)
[/foo, /foo/../bar] => false (..\bar)
[/foo, /foo/./bar] => true (bar)
[/bar/../foo, /foo/bar] => true (bar)
[/foo, ./bar] => false (..\Users\kozhevnikov\Desktop\bar)
[C:\Foo, C:\Foo\Bar] => true (Bar)
[C:\Foo, C:\Bar] => false (..\Bar)
[C:\Foo, D:\Foo\Bar] => false (D:\Foo\Bar)
Run Code Online (Sandbox Code Playgroud)
在ES6中.
const isChildOf = (child, parent) => {
if (child === parent) return false
const parentTokens = parent.split('/').filter(i => i.length)
return parentTokens.every((t, i) => child.split('/')[i] === t)
}
Run Code Online (Sandbox Code Playgroud)
如果您正在使用node.js并且想要使其跨平台,请包含该path模块并替换split('/')为split(path.sep).
所以,你想知道一个目录(比如home/etc/subdirectory)是否是另一个目录的子目录(如home/etc).
它采用假设child和parent路径,并使用split以下方法将它们转换为数组:
['home', 'etc', 'subdirectory'], ['home', 'etc']
Run Code Online (Sandbox Code Playgroud)
然后迭代遍历parent数组中的所有标记,并child使用ES6 逐个检查它们在数组中的相对位置.every().
如果父母中的所有内容都符合孩子的一切,知道我们已经排除了他们是完全相同的目录(使用child !== parent),我们将得到答案.
| 归档时间: |
|
| 查看次数: |
5874 次 |
| 最近记录: |