我正在尝试在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());
}
}
答案 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)
似乎只是颠倒了正则表达式。把“不匹配?”首先,然后“任意偶数?”似乎可以解决问题:
[^?](\\?\\?)*: