0

我试图在 Java 字符串文字中得到类似的结果。如果其中有两个,则为 \,否则它将“转义”后面的任何内容。因此,如果在单个释放字符之后有一个定界符,则不算数。但是两个释放字符解析为一个释放字符文字,所以下面的分隔符应该被认为是一个分隔符。因此,如果在定界符之前有奇数个释放字符,则会被忽略。对于 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

4 回答 4

1

以下应该工作

\b(\?{2})*:
于 2013-06-18T16:03:39.303 回答
0

您的正则表达式意味着:

零个或多个'??'

(\\?\\?)*

后面不是'?'

[^\\?]

以':'结尾

\\:

所以,你的最后一场比赛是最后一个冒号。这就是结果偏移量为 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()); 
}
于 2013-06-13T19:37:45.530 回答
0

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

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

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

于 2013-06-13T19:41:36.707 回答
0

似乎只是反转它起作用的正则表达式。把“不匹配?” 首先,然后“任何偶数个?”似乎可以解决问题:

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

于 2013-06-17T18:34:35.970 回答