我正在使用下面的代码尝试将文件扩展名从传入文件中剥离,并用“ ACK”替换;
不能使用.lastIndexOf,因为Rhino中不可用。
var _filename = String(sourceMap.get('originalFilename'));
pos = -1;
var search = ".";
for(var i = 0; i < _filename.length - search.length; i++) {
if (_filename.substr(i, search.length) == search) {
pos = i;
}
}
logger.info('_pos:' + _pos);
每次我得到pos值为-1 即找不到上一个止损位置。
但是,如果我将文件名硬编码为“ 2020049.259317052.HC.P.F3M147-G”,则效果很好。
与提供非字符串或其他字符串的sourceMap.get('originalFilename')有关吗 字符集?
答案 0 :(得分:2)
这已在快乐3.5上进行了测试。实际上,Rhino的所有欢乐版本都具有String.prototype.lastIndexOf
,至少可以追溯到欢乐版本3.0。您已经正确地将java字符串从sourceMap转换为javascript字符串,但是在这种情况下没有必要。
Java字符串共享String.prototype方法,只要方法名称没有冲突即可。 Java字符串本身具有lastIndexOf方法,因此这就是我的答案中所调用的方法。然后,java字符串能够无缝地从javascript借用slice方法。 javascript方法返回一个javascript字符串。
如果由于某种原因文件名以.
开头且不包含任何其他文件名,则不会为您留下空白的文件名。
var filename = $('originalFilename');
var index = filename.lastIndexOf('.');
if (index > 0) filename = filename.slice(0, index);
logger.info('filename: ' + filename);
话虽如此,我不确定为什么您的原始代码无法正常工作。当我将第一行替换为
var originalFilename = new java.lang.String('2020049.259317052.HC.P.F3M147-G');
var _filename = String(originalFilename);
它给了我正确的pos值22。
答案 1 :(得分:1)
pos = i
但登录_pos
var newFilename = _filename.slice(0, _filename.lastIndexOf('.'))
首先,您要混合使用JavaScript类型和Java类型。
var _filename = String(sourceMap.get('originalFilename'));
相反,做
var _filename = '' + sourceMap.get('originalFilename');
这将导致从Java字符串到JS字符串的类型转换。
第二,有一种更简单的方法可以完成您要尝试做的事情。
var _filenameArr = ('' + sourceMap.get('originalFilename')).split('.');
_filenameArr.pop() // throw away last item
var _filename = _filenameArr.join('.') // rejoin the array with out the last item
logger.info('_filename:' + _filename)