我正在尝试为 EDI 数据格式编写一个解析器,它只是分隔文本,但分隔符是在文件顶部定义的。
本质上,它是一堆基于我在代码顶部读取的值的 splits() 。问题是还有一个自定义的“转义字符”,表示我需要忽略以下分隔符。
例如,假设 * 是分隔符,而 ? 是逃跑,我正在做类似的事情
use Data::Dumper;
my $delim = "*";
my $escape = "?";
my $edi = "foo*bar*baz*aster?*isk";
my @split = split("\\" . $delim, $edi);
print Dumper(\@split);
我需要它返回“aster*isk”作为最后一个元素。
我最初的想法是做一些事情,在我调用我的 split() 函数之前,用一些自定义映射的不可打印的 ascii 序列替换转义字符的每个实例和以下字符,然后使用另一个正则表达式将它们切换回正确的值。
这是可行的,但感觉就像一个 hack,一旦我为所有 5 个不同的潜在分隔符做了这件事,它就会变得非常难看。每个定界符也可能是一个正则表达式特殊字符,导致我自己的正则表达式中有很多转义。
有什么方法可以避免这种情况,可能是通过将特殊的正则表达式传递给我的 split() 调用?