Regex 如何捕获ANTLR语法中的任何内容?

Regex 如何捕获ANTLR语法中的任何内容?,regex,parsing,antlr4,Regex,Parsing,Antlr4,我有一个语法,看起来像一个标记/标记语言。我们用它来制作教科书 有点像: [chapter Introduction] [section First program] Java is pretty cool, **we love it**, let's learn. Use the ::javacc:: to compile stuff. [title C# is also cool] bla bla [code] some

我有一个语法,看起来像一个标记/标记语言。我们用它来制作教科书

有点像:

[chapter Introduction] [section First program] Java is pretty cool, **we love it**, let's learn. Use the ::javacc:: to compile stuff. [title C# is also cool] bla bla [code] some java code in here [/code] 我尝试了
(~']'+?)
来捕获除了结束标记以外的所有内容。这就是我的主要想法:编写许多这样的正则表达式,每个标记对应一个正则表达式,让它们忽略“close标记”。例如,我尝试使用
(~':'+?)
捕获斜体的内容(以
结尾)

我还尝试为内部内容使用通用标记。但是,我需要忽略
***
,以及所有根据上下文实际有意义的符号。因此,我的表达式
RAW:(~[\n\[\]'**'':'''.''.''%''0-9\'.].'.':')+;
不起作用

你可以在这里看到我的完整语法。很抱歉,名称是葡萄牙语的:

grammar Tubaina; @header { package br.com.caelum.tubaina.antlr; } afc : capitulo conteudos+; capitulo : '[chapter ' capitulo_nome ']'; capitulo_nome : (~']'+?)*; conteudos : enter* conteudo+ enter*; conteudo : (secao | texto | subsecao | label | box | codigo | lista | imagem | exercicios | index | tabela | quote | todo | note); secao : '[section ' secao_nome ']'; secao_nome : (~'['+?); quote : '[quote ' quote_texto '--' quote_autor ']'; quote_texto : (~'--'+?); quote_autor : (~']'+?); tabela : '[table "' tabela_nome '"]' tabela_linhas+; tabela_nome : (~'"'+?); tabela_linhas : '[row]' tabela_colunas+ '[/row]'; tabela_colunas : '[col]' tabela_conteudo '[/col]'; tabela_conteudo : conteudo; index : '[index ' index_nome ']'; index_nome : (~']'+?); exercicios : '[exercise]' questoes '[/exercise]'; questoes : (enter* questao_def enter*)+; questao_def : '[question]' enter* questao resposta_def? enter* '[/question]'; questao : (conteudo | enter)+; resposta_def : enter* '[answer]' resposta '[/answer]'; resposta : (texto | enter)+; imagem : '[img ' espaco* imagem_path espaco* imagem_tamanho_def? espaco* (imagem_comentario_def? | ']'); imagem_path : (~' '+?); imagem_tamanho_def : 'w=' imagem_tamanho '%'; imagem_tamanho : NUMERO; imagem_comentario_def : '"' imagem_comentario '"]'; imagem_comentario : (~'"'+?); lista : lista_numerada | lista_nao_numerada; lista_numerada : '[list ' lista_tipo ']' item* '[/list]'; lista_tipo : 'number' | 'roman' | 'letter'; lista_nao_numerada : '[list]' item* '[/list]'; item : enter* '*' texto* enter*; todo : todo_comando todo_comentario ']'; todo_comando : '[todo ' | '[TODO '; todo_comentario : (~']'+?); note : '[note]' note_conteudo+ '[/note]'; note_conteudo : (enter* texto enter*); box : '[box ' box_titulo ']' box_conteudo+ '[/box]'; box_conteudo : (enter* conteudos+ enter*); box_titulo : (~']'+?); subsecao : '[title ' subsecao_nome ']'; subsecao_nome : (~']'+?); label : '[label ' label_nome ']'; label_nome : (~']'+?); codigo : codigo_com_linguagem | codigo_sem_linguagem | codigo_do_arquivo; codigo_do_arquivo : '[code ' linguagem 'filename=' codigo_arquivo_path '[/code]'; codigo_arquivo_path : (~' '+?); codigo_raw : (~'[/code]'+?); linguagem : (~' '+?); codigo_sem_linguagem : '[code]' codigo_raw '[/code]'; codigo_com_linguagem : '[code ' linguagem codigo_fechado codigo_raw '[/code]'; codigo_fechado : ' #]' | ']'; texto : paragrafo | negrito | italico | underline | inline; paragrafo : linha enter?; linha : (~'\n'+?); negrito : '**' linha '**'; italico : '::' linha '::'; underline : '__' linha '__'; inline : '%%' linha '%%'; enter : N | TAB; espaco : ESPACO; N : ['\n']; TAB : '\t'; ESPACO : ' '; NUMERO : [0-9]+; WS : (' ' | '\t') -> skip; 语法图拜纳; @标题{ 包br.com.caelum.tubaina.antlr; } afc:Capitalulo conteudos+; capitulo:“[章节“capitulo_nome”]”; 大写名称:(~']'+?)*; conteudo:输入*conteudo+enter*; 上下文:(secao | texto | subsecao | label | box | codigo | lista | imagem | exercicios | index | tabela | quote | todo | note); secao:“[secao_nome'部分]”; 分词:(~'['+?); 报价:'[quote'quote_texto'-'quote_autor']; 引用文本:(~'-'+?); 自动报价:(~']'+?); tabela:“[表”'tabela_nome'”]'tabela_linhas+; tabela_nome:(~'''+?); tabela_linhas:“[row]”tabela_colunas+“[/row]”; tabela_colunas:'[col]'tabela_conteudo'[/col]'; 塔贝拉•乌孔杜多:孔杜多; 索引:'[index'index_nome']'; 索引名称:(~']'+?); 练习:“[练习]”问题“[/练习]”; 问题:(输入*questao_def enter*)+; 提问:“[问题]”输入*questao resposta_def?输入*“[/question]”; questao:(conteudo | enter)+; resposta_def:输入*'[answer]'resposta'[/answer]'; resposta:(texto | enter)+; 图像M:“[img”espaco*图像M_路径espaco*图像M_tamanho_def?espaco*(图像M_comentario_def?)”; 图像路径:(~''+?); imagem_tamanho_def:'w='imagem_tamanho''; imagem_tamanho:数字; imagem_comentario_def:“‘imagem_comentario’””; 图像元素:(~'“'+?); lista:lista_numerada | lista_nao_numerada; lista_numerada:“[list'lista_tipo']”项*“[/list]”; lista|u tipo:“数字”|“罗马”|“字母”; lista_nao_numerada:“[list]”项*“[/list]”; 项目:输入*'*'文本到*输入*; todo:todo_comando todo_comentario']; 待办事项:待办事项; todo_comentario:(~']'+?); 注:“[note]”注_conteudo+“[/note]”; 注:(输入*文本输入*); 方框:'[box'box_titulo']'box_conteudo+'[/box]'; 框_conteudo:(输入*conteudos+输入*); 框体:(~']'+?); 水下作业:“[标题“水下作业”]; 海底名称:(~']'+?); 标签:'[标签'标签名称']; 标签名称:(~']'+?); codigo:codigo_com|u linguage | codigo_sem|u linguage | codigo_do|u arquivo; codigo_do_arquivo:'[code'linguage'文件名='codigo_arquivo_路径'[/code]'; codigo_arquivo_路径:(~''+?); 原始代码:(~'[/code]'+?); 语言:(~''+?); codigo_sem_language:'[code]'codigo_raw'[/code]'; codigo_com_language:“[code'linguage codigo_fechado codigo_raw'[/code]”; codigo_fechado:'#]'|'']; texto:paragrafo | negrito | italic | underline | inline; 段落:林哈进入?; 林哈:(~'\n'+?); 内格里托:“**”林哈“**”; 斜体:“::”林哈:“:”; 下划线:''''linha''; 内联:“%%”linha“%”; 输入:N |选项卡; espaco:espaco; N:['\N']; 选项卡:'\t'; 埃斯帕科:; 数字:[0-9]+; WS:(''|'\t')->跳过; 此外,我对通用正则表达式的尝试如下:

我的问题是:我如何为这样一种语言编写语法,在这种语言中,我有标记和任何内容,有什么想法吗


提前感谢!

我不确定antlr,所以我发布了这个答案,可能会帮助您理解regex的想法

您可以使用这样的正则表达式:

\[code\]([\s\S]+)\[/code\]|\[title (.+)\]

匹配信息

MATCH 1
2.  [165-180]   `C# is also cool`
MATCH 2
1.  [207-241]   `

    some java code in here

    `
我使用或将两个正则表达式放在一个复合表达式中,以向您展示这个想法。如果您能够使用2个正则表达式,那么您可以使用以下表达式:

secao : '[section ' secao_nome ']'; secao_nome : (~']'+?);
\[code\]([\s\S]+)\[/code\]   <-- to capture the [code]XX[/code] content
\[title (.+)\]               <-- to capture the [title XX] content
\[code\]([\s\s]+)\[/code\]