我想匹配[#ABABAB]blah blah blah[/#ABABAB]
但我不想匹配[#ABABAB]blah blah blah[/#000000]
ABABAB和000000是十六进制颜色代码。
第一个是我想要的,因为它的开放标签和关闭标签的颜色代码是相同的,但第二个不是。
我尝试过这种模式,但它不起作用:\[#[0-9|A-F]{6}\].*\[/#[0-9|A-F]{6}\]
答案 0 :(得分:5)
试试这个:
\[(#[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\\]"));
true false
答案 1 :(得分:1)
如果您的输入看起来像
"xxxx[#aaaaaa]yyyyy[#bbbbbb]zzzzzz[/#bbbbbb]yyyyy[/#aaaaaa]zzzzzz"
其中x
将具有默认颜色,y
将具有aaaaaa颜色,z
将具有bbbbbb颜色,并且您想要找到
[#aaaaaa]yyyyy[#bbbbbb]zzzzzz[/#bbbbbb]yyyyy[/#aaaaaa]
和
[#bbbbbb]zzzzzz[/#bbbbbb]
你应该将look-ahead(?= ...)机制添加到arshajii's answer制作你的正则表达式
"(?=(\\[(#[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]