【发布时间】:2022-11-15 09:48:35
【问题描述】:
我正在尝试从生成的文件名中提取用户 ID。首先我把它们写成:
id_timestamp.ext
现在我需要读取列表并从文件列表中过滤出仅具有 id 拥有文件的特定用户。
我认为做
substring(fileName, id.length)
是靠不住的。
有没有办法做到这一点?我应该使用正则表达式吗?
【问题讨论】:
-
什么是
id?你对substring操作的结果做了什么?
标签: javascript
我正在尝试从生成的文件名中提取用户 ID。首先我把它们写成:
id_timestamp.ext
现在我需要读取列表并从文件列表中过滤出仅具有 id 拥有文件的特定用户。
我认为做
substring(fileName, id.length)
是靠不住的。
有没有办法做到这一点?我应该使用正则表达式吗?
【问题讨论】:
id?你对 substring 操作的结果做了什么?
标签: javascript
您可以使用正则表达式来解决您的问题。
const filename = 'id_timestamp.ext';
const regex = /^(w+)_timestamp.ext$/;
const id = filename.match(regex)[1];
这是通过将 id 部分与捕获组匹配来实现的。该组可以用作 id,因为它只包含 id 部分。
或者,您可以使用 indexOf 的组合来查找下划线的位置,并使用 substring 来获取该位置的第一部分。
const filename = 'id_timestamp.ext';
const id = filename.substring(0, filename.indexOf("_"))
如果 id 始终具有相同的长度,那么您甚至可以摆脱 indexOf 部分。
【讨论】:
假设你建立了你的文件名
const filename = `${id}_${timestamp}.ext`;
并假设您的 id 和时间戳不包含时间戳(以便生成的文件名明确),您可以通过以下方式检查文件是否属于某个用户
filename.startsWith(`${id}_`)
请注意,您需要包含下划线,filename.startsWith(id) 会导致误报,因为您的 ID 不太可能没有前缀。
【讨论】:
如果您的id 将始终是第一个并且您生成的是id_timestamp.ext 模式
我建议使用以下方法从文件名中提取 id
const fileName = `1234_file.txt`;
const arr = fileName.split("_");
const id = arr[0];
console.log(id) // "1234"
【讨论】:
我可能把这个说得太简单了,但是......
getId = function(s){ s = s.substring(this,s.lastIndexOf('.')); s = s.substring(this,s.lastIndexOf('_')); return s; }
如果所需的格式保持不变,似乎可以解决问题。
s.substring(this,s.lastIndexOf('.') 隔离扩展和
.lastIndexOf('_') 将搜索字符串中剩余的最后一个 _ 出现。
这是可回收功能的缩小版
getId = function(s){ return s.substring(this,s.substring(this,s.lastIndexOf('.')).lastIndexOf('_')); }
如果这是在加载时发生的,这里是一个直接的
filename.substring(this,filename.substring(this,filename.lastIndexOf('.')).lastIndexOf('_'));
以下任一功能选项的示例
var filenameA = 'id_timestamp.ext';
var filenameB = 'testID_123654789.ext_';
getID(filenameA)或getID(filenameB)
结果
文件名A 结果:ID
文件名B结果:测试编号
【讨论】: