Java正则表达式用于查找具有释放字符的分隔符

时间:2013-06-13 19:32:15

标签: java regex

我正在尝试在Java String文字中获得类似的结果。如果有两个,那就是\,否则它会“逃脱”以下任何内容。因此,如果在单个释放char之后存在分隔符,则它不计算在内。但是两个释放字符解析为释放字符文字,因此以下分隔符应被视为分隔符。因此,如果奇数个释放字符位于分隔符之前,则忽略它。对于0或偶数,它是一个分隔符。所以,在下面的代码示例中:

?: <- : is not a delimiter
??: <- : is a delimiter
???: <- : is not a delimiter
????: <- : is a delimiter

以下示例代码显示了什么不起作用。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestPattern
{
    public static void main(final String[] args)
    {
        final Matcher m = Pattern.compile("(\\?\\?)*[^\\?]\\:").matcher("a??:b:c");
        m.find(0);
        System.out.println(m.end());
    }
}

4 个答案:

答案 0 :(得分:1)

以下内容应该有效

\b(\?{2})*:

答案 1 :(得分:0)

你的正则表达式意味着:

零或更多&#39; ??&#39;

(\\?\\?)*

其次不是&#39;?&#39;

[^\\?]

结束于&#39;:#39;

\\:

所以,你的最后一场比赛是最后一次比赛。这就是结果偏移为6的原因。

您可以更改:

final Matcher m = Pattern.compile("((\\?){2})+").matcher("a??:b:????:c");
while (m.find()){
    //outputs 1 and 6, places 
    //you would have to start
    //scaping...
    System.out.println(m.start()); 
}

答案 2 :(得分:0)

*表示该组可以为零。这样捕获组可以是空字符串。 [^\\?]可以是任何不是?的字符,因为?不是字符类中的特殊字符。 \被忽略。

因此,b:(前面有一个空字符串)匹配,第二个冒号是你的最后一个(在这种情况下,第一个)匹配。

我认为你只想要"(\\?\\?)*\\?:"

答案 3 :(得分:0)

似乎只是颠倒了正则表达式。把“不匹配?”首先,然后“任意偶数?”似乎可以解决问题:

[^?](\\?\\?)*: