我要匹配[#ABABAB]blah blah blah[/#ABABAB]
但我不想匹配[#ABABAB]blah blah blah[/#000000]
ABABAB 和 000000 是十六进制颜色代码。
第一个是我想要的,因为它的打开标签和关闭标签的颜色代码是相同的,但第二个不是。
我尝试过这种模式,但没有奏效:\[#[0-9|A-F]{6}\].*\[/#[0-9|A-F]{6}\]
尝试这个:
\[(#[0-9a-fA-F]{6})\].*?\[/\1\]
System.out.println("[#ABABAB]blah blah blah[/#ABABAB]"
.matches("\\[(#[0-9a-fA-F]{6})\\].*?\\[/\\1\\]"));
System.out.println("[#ABABAB]blah blah blah[/#000000]"
.matches("\\[(#[0-9a-fA-F]{6})\\].*?\\[/\\1\\]"));
真的 错误的
如果您的输入看起来像
"xxxx[#aaaaaa]yyyyy[#bbbbbb]zzzzzz[/#bbbbbb]yyyyy[/#aaaaaa]zzzzzz"
wherex
将有默认颜色,y
将有 aaaaaa 颜色,z
并将有 bbbbbb 颜色,你想找到
[#aaaaaa]yyyyy[#bbbbbb]zzzzzz[/#bbbbbb]yyyyy[/#aaaaaa]
和
[#bbbbbb]zzzzzz[/#bbbbbb]
您应该在arshajii 的答案中添加前瞻(?=...) 机制来制作您的正则表达式
"(?=(\\[(#[0-9a-fA-F]{6})\\].*?\\[/\\2\\]))"
演示
String data="xxxx[#aaaaaa]yyyyy[#bbbbbb]zzzzzz[/#bbbbbb]yyyyy[/#aaaaaa]zzzzzz";
Pattern p=Pattern.compile("(?=(\\[(#[0-9a-fA-F]{6})\\].*?\\[/\\2\\]))");
Matcher m=p.matcher(data);
while(m.find())
System.out.println(m.group(1));
输出
[#aaaaaa]xxxx[#bbbbbb]yyyy[/#bbbbbb]xxxxx[/#aaaaaa]
[#bbbbbb]yyyy[/#bbbbbb]