能否用JavaScript从文本评论提取时间?BIRT环境下技术咨询
当然可以实现!你的思路没问题,只需调整正则覆盖完整的日期时间
别担心,你的需求完全能搞定——而且你已经找对了方向,用正则表达式提取文本中的时间信息是这类场景的标准解法。只是你当前的正则只匹配了时分秒部分,没有包含前面的日期,所以我们稍微调整一下就能拿到完整的YYYY/MM/DD HH:MM:SS格式时间。
先分析你的现有代码
你写的这段:
var str = dataSetRow["Comment - Result"]; var time = str.match(/([0-1]\d|2[0-3]):([0-5]\d):([0-5]\d)/g); time;
确实能从文本里抓到01:31:33,但漏掉了前面的2018/04/12。我们只需要把日期部分的匹配规则加进正则里就行。
改进后的代码方案
1. 提取完整的日期时间字符串
如果只需要拿到和文本里格式一致的时间字符串,用这个更简洁的正则就够:
var str = dataSetRow["Comment - Result"]; // 匹配YYYY/MM/DD HH:MM:SS格式的完整时间 var timeMatch = str.match(/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/); // 处理匹配不到的情况,避免报错 var extractedTime = timeMatch ? timeMatch[0] : "未找到有效时间"; extractedTime;
这个正则的意思是:匹配4位数字+斜杠+2位数字+斜杠+2位数字+空格+2位数字+冒号+2位数字+冒号+2位数字,刚好对应你示例里的日期时间格式。
2. 更严谨的正则(可选)
如果你需要确保日期的合法性(比如月份不超过12,日期不超过31),可以用更严格的正则:
var strictMatch = str.match(/(19|20)\d{2}\/(0[1-9]|1[0-2])\/(0[1-9]|[12]\d|3[01]) ([01]\d|2[0-3]):([0-5]\d):([0-5]\d)/); var strictTime = strictMatch ? strictMatch[0] : "未找到有效时间";
这个正则会限制年份是19xx或20xx,月份是01-12,日期是01-31,时间是00-23:00-59:00-59,适合对格式合法性要求高的场景。
3. 在BIRT中进一步处理(可选)
如果需要把提取到的时间转换成可计算的Date对象(比如用于排序、格式化输出),可以在拿到字符串后做转换:
if (extractedTime) { // JS原生支持YYYY/MM/DD格式的字符串转Date var dateObj = new Date(extractedTime); // 比如转换成本地化格式:2018/4/12 上午1:31:33 var formattedTime = dateObj.toLocaleString(); // 或者自定义格式,比如YYYY-MM-DD HH:mm:ss var customFormat = `${dateObj.getFullYear()}-${String(dateObj.getMonth()+1).padStart(2,'0')}-${String(dateObj.getDate()).padStart(2,'0')} ${String(dateObj.getHours()).padStart(2,'0')}:${String(dateObj.getMinutes()).padStart(2,'0')}:${String(dateObj.getSeconds()).padStart(2,'0')}`; }
注意事项
- 如果你的文本中可能出现多个时间,可以给正则加上
g标志(比如/.../g),此时match会返回一个数组,你可以遍历数组拿到所有时间。 - 确保正则里的分隔符(比如
/、空格、:)和你实际文本中的完全一致,如果文本里日期用-分隔,就把正则里的\/改成\-。 - 在BIRT中,要确认
dataSetRow["Comment - Result"]确实能正确获取到目标字段的值,避免因字段名拼写错误导致拿不到文本。
放心用吧,这个方案在支持JavaScript的BIRT环境里完全可行~
内容的提问来源于stack exchange,提问作者copium
相关产品推荐
相关产品推荐

