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

避免重复在java中为多个模式的匹配关键字编写正则表达式?,java,regex,refactoring,Java,Regex,Refactoring,我有N个关键字,key1key2按键 我有3个模式来匹配关键字。(为了简化问题,我只使用key1而不是real关键字) /keyword{keyword}(关键字) 我决定通过简单地使用正则表达式来查找匹配模式: 我写的模式是: (?:/)(key1|key2|key3)|(?:{)(key1|key2|key3)(?:})|(?:\()(key1|key2|key3)(?:\)) 但是对于关键字(key1 | key2 | key3),我需要写3次,而且我得到了3个组(应该减少到1以获得最佳

我有N个关键字,
key1
key2
<代码>按键

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

/keyword
{keyword}
(关键字)

我决定通过简单地使用正则表达式来查找匹配模式:

我写的模式是:

(?:/)(key1|key2|key3)|(?:{)(key1|key2|key3)(?:})|(?:\()(key1|key2|key3)(?:\))
但是对于关键字(
key1 | key2 | key3
),我需要写3次,而且我得到了3个组(应该减少到1以获得最佳结果)

如何在Java或标准正则表达式中实现这一点?

这是可能的(如果我没有遗漏任何边缘情况),但可能有点麻烦。 您可以尝试以下正则表达式:

"([{/(])(aaa|bbb|ccc)((?<=/(aaa|bbb|ccc))|(?<=\\((aaa|bbb|ccc))\\)|(?<=\\{(aaa|bbb|ccc))\\})"

其中,
{1,4}
的长度应与匹配键所需的长度相同

使用字符串连接来构建正则表达式。Java正则表达式中没有更好的方法。答案的可能重复使用了
key1 | key2 | key3
三次以上。我将检查您的组trickWell不幸的是,在lookbehinds中不可能使用反向引用(至少在Java正则表达式中),因此我恐怕没有办法避免这种重复。但是匹配总是在第2组中,因此至少没有if语句或检索结果的必要性
"([{/(])(aaa|bbb|ccc)((?<=(?=/\\2).{1,4})|(?<=(?=\\(\\2).{1,4})\\)|(?<=(?=\\{\\2).{1,4})\\})"