Java 捕获由特殊字符嵌套/包围的正则表达式组

Java 捕获由特殊字符嵌套/包围的正则表达式组,java,regex,Java,Regex,我正在尝试搜索出现在波浪(~)符号边框内的单词 e.g. ~albert~ is a ~good~ boy. 我知道通过使用~.+?~这是可能的,而且它已经对我起作用了。但在一些特殊情况下,我需要匹配嵌套的平铺语句 e.g. ~The ~spectacle~~ was ~broken~ 在上面的例子中,我必须分别捕捉“奇观”、“奇观”和“破碎”。这些将被逐字翻译或随附文章(An,The,随便什么)。原因是在我的系统中: 1) 'The spectacle' requires a sepa

我正在尝试搜索出现在波浪(
~
)符号边框内的单词

 e.g. ~albert~ is a ~good~ boy.
我知道通过使用
~.+?~
这是可能的,而且它已经对我起作用了。但在一些特殊情况下,我需要匹配嵌套的平铺语句

 e.g. ~The ~spectacle~~ was ~broken~
在上面的例子中,我必须分别捕捉“奇观”、“奇观”和“破碎”。这些将被逐字翻译或随附文章(An,The,随便什么)。原因是在我的系统中:

1) 'The spectacle' requires a separate translation on a specific cases.
2) 'Spectacle' also needs translation on specific cases.
3) IF a tranlsation exist for The spectacle, we will use that, ELSE 
   we will use 
解释这一点的另一个例子是:

 ~The ~spectacle~~ was ~borken~, but that was not the same ~spectacle~ 
  that was given to ~me~.
在上面的例子中,我将翻译:

 1) 'The spectacle' (because the translation case exists for 'The spectacle', otherwise I would've only translated spectacle on it's own)
 2) 'broken'
 3) 'spectacle'
 4) me
我在组合一个表达式时遇到了问题,该表达式将确保在正则表达式中捕获该表达式。到目前为止,我设法使用的是“~.+?~”。但我知道,通过某种形式的“向前看”或“向后看”,我可以让它工作。有人能帮我吗

其中最重要的方面是回归证明,这将确保现有的东西不会损坏。如果我能把它做好,我会把它贴出来


注意:如果有帮助的话,目前我将有一些实例,其中只有一个嵌套级别需要分解。因此,~奇观~~将是最深刻的层次(直到我需要更多!!!)

我不久前写过类似的东西,但我没有对它进行过太多测试:

(~(?(?=.*?~~.*?~).*?~.*?~.*?~|[^~]+?~))

另一种选择

(~(?:.*?~.*?~){0,2}.*?~)
                 ^^ change to max depth
哪一个最好

要添加更多,请在看到一组的两个位置添加几组额外的
*?~

主要问题 如果我们允许无限制的筑巢,我们怎么知道它将在哪里结束和开始?笨拙的图表:

~This text could be nested ~ so could this~ and this~ this ~Also this~
|                          |              |_________|      |         |
|                          |_______________________________|         |
|____________________________________________________________________|
或:

编译器不知道该选择哪个

谢谢你的判决 或:

我该怎么办? 使用交替字符(如@tbraun建议的),以便编译器知道从何处开始和结束:

{This text can be {properly {nested}} without problems} because {the compiler {can {see {the}}} start and end points} easily. Or use a compiler:
注意:我不太懂Java,所以有些代码可能不正确

import java.util.List;
String[]chars=myString.split(“”);
int深度=0;
int lastMath=0;
列表结果=新建ArrayList();
对于(int i=0;i

这使用了

您需要一些东西来区分开始/结束模式。即
{}

然后可以使用模式
\{[^{]*?\}
排除
{

{The {spectacle}} was {broken}
第一次迭代

{spectacle}
{broken}
{The spectacle}
第二次迭代

{spectacle}
{broken}
{The spectacle}

我认为第二个例子也应该产生
中断的
。除非您可以将自己限制在固定的嵌套深度,否则您需要一个能够处理递归的正则表达式引擎。您使用的是哪一个?@stribizev您是对的,正在更新主体now@TimPietzcker我将在Java中使用它,但我认为这可能是一个特定于正则表达式的任务ion,所以没有用java标记它。所有正则表达式问题都需要一个语言标记(请参阅)。抱歉,java正则表达式中没有递归。根据我的测试,如果有3层或更多的tildes@VoidpawOP说他只会有一层,他还特别说“直到我需要更多!”,所以我们不妨尝试解决这个问题,而不考虑层的数量。@tbraun我已经提到过你:)为什么要进行向下投票?在我的帖子说真正的解决方案是使用替换字符{}之后,其他解决方案被更新了。我不应该因为提供了真正的解决方案而受到惩罚
{The {spectacle}} was {broken}
{spectacle}
{broken}
{The spectacle}