正则表达式:如何结合前瞻和后瞻

时间:2013-01-08 01:48:48

标签: java regex

我有一串逗号分隔的字符,我正在拆分。但是,其中一些字符可能是逗号。例如:

test = "a,b,c,d,,,e,f,g"

我知道(?<!,),是“任何逗号前面没有逗号”的正则表达式,而,(?!,)是“任何逗号后跟逗号”的正则表达式。有人能指出我正确的方向并告诉我如何将这两者结合起来。所需的输出是:

a  
b  
c  
d  
,  
e  
f  
g  

该程序是用Java编写的,所以如果有人知道特定于Java的函数,那也是可行的。

5 个答案:

答案 0 :(得分:1)

Regex: replace single characters

中解决的类似问题

只是合并你拥有的两个正则表达式,因为(?<!,),(?!,)应该可以解决问题,除非在这个区域中ruby和Java之间存在细微差别。

如果您要删除所有单,并专门用,,,替换,,那么您可以运行搜索并从(?<!,)?,(?!,)两次删除匹配的字符。

答案 1 :(得分:1)

您可以使用(.)(?:,|$)代替lookahead / lookbehind。

(?:,|$)将匹配中间的逗号或最后一个字符的行尾,而(.)将捕获该字符。

显然,只有在匹配正则表达式时才会起作用,而不是在字符串的split方法上使用表达式时;在这种情况下,您应该按照建议使用^(?<=,),^(?!=,)

答案 2 :(得分:1)

只有在,之前或之后没有,时才按 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

输出:

{{1}}

答案 3 :(得分:0)

以下内容会找到一个后跟逗号的字符,然后只取第一个字符删除最后一个逗号:

        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));
        }

答案 4 :(得分: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]);