我有一串逗号分隔的字符,我正在拆分。但是,其中一些字符可能是逗号。例如:
test = "a,b,c,d,,,e,f,g"
我知道这(?<!,),
是“任何逗号前面没有逗号”,(?!,)
的正则表达式,并且是“任何逗号后面跟着一个逗号”的正则表达式。有人可以指出我正确的方向并告诉我如何将这两者结合起来。所需的输出是:
a
b
c
d
,
e
f
g
该程序是用 Java 编写的,所以如果有人知道 Java 特有的函数,那也可以。
Regex中解决的类似问题:替换单个字符
只需合并您拥有的两个正则表达式,就(?<!,),(?!,)
可以做到这一点,除非 ruby 和 Java 在这方面存在细微差别。
如果要删除所有单个,
并专门替换,,,
为,
,则可以运行搜索并从(?<!,)?,(?!,)
两次中删除匹配的字符。
您可以使用(.)(?:,|$)
而不是前瞻/后视。
(?:,|$)
将匹配最后一个字符之间的逗号或行尾,而(.)
将捕获该字符。
显然,这仅在您与正则表达式匹配时才有效,而不是在您使用字符串split
方法上的表达式时;在这种情况下,您应该按照您的建议使用^(?<=,),^(?!=,)
.
,
只有在没有,
之前或之后的情况下才能拆分。
String str = "a,b,c,d,,,e,f,g";
String regex = "(?<!,),|,(?!,)";
for(String s : str.split(regex)) {
System.out.println(s);
}
输出:
a b c d , e f g
以下将找到一个字符后跟一个逗号,然后通过仅取第一个字符来删除最后一个逗号:
String test = "a,b,c,d,,,e,f,g";
Pattern p=Pattern.compile(".,|.$");
Matcher m=p.matcher(test);
while(m.find() ){
System.out.println(m.group().charAt(0));
}
假设对于数据"a,b,c,d,,,,,e,f,g"
拆分应该看起来像a b c d , , e f g
您可以找到一对昏迷并在它们之间放置一些特殊标记。这样你就会知道,带有特殊标记的昏迷需要被移除,而带有特殊标记的昏迷需要保留。基于该想法的代码看起来像
String data = "a,b,c,d,,,,,e,f,g";
data = data.replace(",,", ",XspecialSplitX,");
String[] tokens = data.split(",XspecialSplitX|(?<!XspecialSplitX),");
for (String s : tokens)
System.out.print(s+" ");
输出:a b c d , , e f g
没有正则表达式的更快更简单的方法。
如果您的字符串仅包含用逗号分隔的单个字符,那么所有想要的字符都将具有偶数索引并且分隔逗号奇数。在这种情况下,您需要做的就是像这样遍历所有偶数索引
char[] data="a,b,c,d,,,e,f,g".toCharArray();
for(int i=0; i<data.length; i+=2)
System.out.println(data[i]);