避免重复在java中编写正则表达式以获得多个模式的匹配关键字?

时间:2015-06-17 08:24:50

标签: java regex refactoring

我有N个关键字,key1 key2 ... keyN

我有3个匹配关键字的模式。 (为了简化问题,我只使用key1而不是真正的关键字)

/keyword {keyword} (keyword)

我决定只使用正则表达式找到匹配模式:

我写的模式:

(?:/)(key1|key2|key3)|(?:{)(key1|key2|key3)(?:})|(?:\()(key1|key2|key3)(?:\))

但是对于关键字(key1|key2|key3),我需要写3次,我也有3组(为了获得最佳结果,应该减少到1)。

如何在Java或标准正则表达式中实现此目的?

1 个答案:

答案 0 :(得分:0)

有可能(如果我没有错过任何边缘情况),但可能有点麻烦。

你可以试试这个正则表达式:

"([{/(])(aaa|bbb|ccc)((?<=/(aaa|bbb|ccc))|(?<=\\((aaa|bbb|ccc))\\)|(?<=\\{(aaa|bbb|ccc))\\})"
  • ([{/(])匹配/({
  • (aaa|bbb|ccc)与您的密钥(第2组)匹配
  • (?<=/(aaa|bbb|ccc))没有任何匹配,但有一个lookbehind,确保/在开头
    • (?<=\\((aaa|bbb|ccc))\\)匹配),并且通过lookbehind确保(位于开头
    • (?<=\\{(aaa|bbb|ccc))\\}匹配},并且通过lookbehind确保{位于开头

使用此问题的信息:Backreferences in lookbehind 你可以试试这个正则表达式而无需重复:

"([{/(])(aaa|bbb|ccc)((?<=(?=/\\2).{1,4})|(?<=(?=\\(\\2).{1,4})\\)|(?<=(?=\\{\\2).{1,4})\\})"

其中.{1,4}应该与您的密钥匹配所需的时间