【发布时间】:2011-10-16 07:33:39
【问题描述】:
我有点难以想出用正则表达式来分解具有以下属性的字符串:
- 由 | 分隔(管道)字符
- 如果单个值包含管道,则使用 \(反斜杠)转义
- 如果单个值以反斜杠结尾,则使用反斜杠转义
例如,这里有一些我想分解的字符串:
-
One|Two|Three应该产生:["One", "Two", "Three"] -
One\|Two\|Three应该产生:["One|Two|Three"] -
One\\|Two\|Three应该产生:["One\", "Two|Three"]
现在我怎么能用一个正则表达式来拆分它?
更新:正如你们中的许多人已经建议的那样,这不是一个好的正则表达式应用程序。此外,正则表达式解决方案比仅迭代字符要慢几个数量级。我最终遍历了字符:
public static List<String> splitValues(String val) {
final List<String> list = new ArrayList<String>();
boolean esc = false;
final StringBuilder sb = new StringBuilder(1024);
final CharacterIterator it = new StringCharacterIterator(val);
for(char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
if(esc) {
sb.append(c);
esc = false;
} else if(c == '\\') {
esc = true;
} else if(c == '|') {
list.add(sb.toString());
sb.delete(0, sb.length());
} else {
sb.append(c);
}
}
if(sb.length() > 0) {
list.add(sb.toString());
}
return list;
}
【问题讨论】:
-
让我们说清楚。你想要的是这样的:分割|并将其从字符串中删除,不要用 \| 分割并从字符串中删除 \,最后由 \\| 分割并删除 \|从第一部分和 \ 从第二部分。你认为这可以用一个正则表达式来实现吗?在我看来,情况完全不同......
-
是否可以更改分隔符?
-
我认为你们是对的!这对于正则表达式来说可能太多了。