KNIME中如何编写正则移除竖线分隔字符串的重复数字编码
KNIME行内竖线分隔编码去重正则方案
原有正则失效原因
你之前使用的\b(\d+)\b.*\b\1\b正则采用贪婪匹配逻辑,会命中从首个重复编码开始到行尾的长文本片段,替换时会丢失大量非重复编码,无法实现「保留首次出现的编码、移除后续重复项」的需求。
全版本兼容方案(推荐)
该方案不依赖高版本正则引擎特性,适配所有KNIME版本,稳定性高:
- 拖入
String Replacer(字符串替换)节点,接入待处理数据集 - 节点配置如下:
- 选中存储竖线分隔编码的目标列
- 勾选
Regular expression(正则表达式)、Global replacement(全局替换)选项 - 查找规则(Pattern)填入以下正则:
\b(\d+)\b(.*?)\|\1\b - 替换内容(Replacement)填入:
$1$2
- 将该字符串替换节点放入KNIME循环流中,设置循环终止条件为「替换后目标列内容与替换前完全一致」即可。该正则每次替换会移除每行中位置最靠后的1个重复编码,循环执行直到没有可替换的重复项,自动完成去重。
高版本KNIME单次替换方案
如果你的KNIME运行在Java 9及以上环境(支持不定长度反向预查),可以直接使用以下正则做全局替换,无需搭建循环,一次执行即可完成去重:
- 查找规则:
\|(\d+)\b(?<=\b\1\b.*\1) - 替换内容留空即可。
提示:如果执行该正则时报语法错误,说明当前KNIME的正则引擎版本不支持高级特性,切换为上述全版本兼容方案即可。
处理效果验证
使用你提供的样例数据测试,两种方案最终输出均完全匹配预期:
0612|0613|061 0211|0612|021|0212 0111 0511|0512|0521
内容的提问来源于stack exchange,提问作者citizen4
相关产品推荐
相关产品推荐

