欢乐字符串处理

Mirth String Handling

我正在使用下面的代码尝试去除传入文件的文件扩展名并将其替换为 "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') 有关 字符集 ?

新答案

  1. 经过审查和测试agermano 说他是正确的。
  2. 在您的示例代码中,您正在设置 pos = i 但记录 _pos
  3. 新答案var newFilename = _filename.slice(0, _filename.lastIndexOf('.'))

较早的答案

首先,您混合了 Java 脚本类型和 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)

这是在 mirth 3.5 上测试的。事实上,Rhino 确实有 String.prototype.lastIndexOf 用于所有至少可以追溯到 mirth 3.0 的 mirth 版本。您正确地将 java 字符串从 sourceMap 转换为 javascript 字符串,但是,在这种情况下没有必要。

Java 个字符串共享 String.prototype 个方法,只要方法名不冲突即可。 Java 字符串本身有一个 lastIndexOf 方法,所以这就是我的回答中调用的方法。 java 字符串可以无缝地从 javascript 中借用 slice 方法。 java脚本方法returns一个java脚本字符串。

如果由于某种原因文件名以 . 开头且不包含任何其他内容,则不会留下空白文件名。

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。