正则表达式可以匹配此模式吗?

时间:2013-08-08 13:39:41

标签: java regex

我想匹配[#ABABAB]blah blah blah[/#ABABAB]

但我不想匹配[#ABABAB]blah blah blah[/#000000]

ABABAB和000000是十六进制颜色代码。

第一个是我想要的,因为它的开放标签和关闭标签的颜色代码是相同的,但第二个不是。

我尝试过这种模式,但它不起作用:\[#[0-9|A-F]{6}\].*\[/#[0-9|A-F]{6}\]

2 个答案:

答案 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]