【发布时间】:2014-12-20 20:01:04
【问题描述】:
我有许多 EDIFACT 格式的行需要在 + 上进行标记。但是,根据 EDIFACT 规范,可以使用 ? 转义字符。例如:?? 代表 ?,?+ 代表 +,?: 代表 :。 ?+ 是字段的一部分,因此不应被视为分隔符。
我使用否定的lookbehind 来处理+ 后跟?:
delimiter = "\\+";
String[] tokens = data.split("(?<!\\?)" + delimiter);
这会分裂
a+b+c 转换为 a、b 和 c
a?+b+c 转换为 a?+b 和 c
但是,当涉及?? 转义序列时,它会失败:
a??+b+c 产生 2 个令牌:a??+b、c
而实际上应该是 3 个令牌:a?、b 和 c
另一方面:a???+b+c 应该产生两个令牌:a???+b 和 c
有没有办法使用消极的后视来实现这一点?
如果你愿意,这里有一个可运行的测试。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
assertTokens("a+b+c", "a", "b", "c");
assertTokens("a?+b+c", "a?+b", "c");
assertTokens("a??+b+c", "a??", "b", "c");
assertTokens("a???+b+c", "a???+b", "c");
}
private static void assertTokens(String data, String... expectedTokens) {
String delimiter = "\\+";
String[] tokens = data.split("(?<!\\?)" + delimiter);
if(!Arrays.deepEquals(tokens, expectedTokens)) {
throw new IllegalStateException("Not equals for " + data);
}
}
}
【问题讨论】:
标签: java regex tokenize regex-negation