虚假字符串处理

时间:2020-04-29 05:07:09

标签: mirth

我正在使用下面的代码尝试将文件扩展名从传入文件中剥离,并用“ 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')有关吗 字符集?

2 个答案:

答案 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)

新答案

  1. 查看并测试了Agermano所说的话是正确的。
  2. 在示例代码中,您设置pos = i但登录_pos
  3. 新答案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)