接收一个管道分隔的参数,需要对其进行标记;但是可以使用 \| 转义管道 表示它不是分隔符,而是令牌的一部分。我知道 Java 编译器使用字符串文字中的 " 和转义引号 \" 来执行此操作。
但不确定一个好的实用函数/算法来标记这样的字符串。输出将是一个字符串列表。
示例输入 1:,"jk|g4"
输出:("jk" , "g4"
包含 2 个字符串的列表)
示例输入 2: "j\|k|g4|b"
,输出 :("j|k" , "g4", "b"
包含 3 个字符串和文字管道的列表)
尝试使用String.indexOf("|")
,然后检查前一个字符是否为 \ ...但有错误并想确保:有没有更简单的方法?正则表达式?
这是我所拥有的:
import java.util.ArrayList;
import java.util.List;
public class PasrePipes {
public static void main(String[] args) {
String in = "j\\|k|g4|b";
{
String[] ex = { "j|k", "g4", "b" };
tst(in, ex);
}
in = "j|k|g4|b";
{
String[] ex = { "j", "k", "g4", "b" };
tst(in, ex);
}
}
private static void tst(String in, String[] ex) {
System.out.println("----\n" + in);
List<String> toks = parse(in);
if (toks.size() != ex.length) {
System.out.println("size mismatch, got :" + toks.size() + " exp " + ex.length);
}
for (int i = 0; i < ex.length; i++) {
if (toks.size() > i) {
String n = toks.get(i);
if (!ex[i].equals(n)) {
System.out.println(" mismatch :" + i + ", got :" + n + "; exp :" + ex[i]);
} else {
System.out.println(" okay :" + i + "; exp :" + ex[i]);
}
}
}
System.out.println("--");
}
private static List<String> parse(String in) {
List<String> tokens = new ArrayList<String>();
int i = in.indexOf('|');
int old = 0;
while (i > -1) {
if (i > 0) {
if (in.charAt(i - 1) == '\\') {
i = in.indexOf('|', i + 1);
continue;
}
}
String s = in.substring(old, i);
s.replace("\\|", "|");
tokens.add(s);
old = i + 1;
i = in.indexOf('|', i + 1);
}
if(i > 0 && i < (in.length() - 1)) {
String s = in.substring(i + 1);
s.replace("\\|", "|");
tokens.add(s);
}
return tokens;
}
}