REGEX - Small details that do not match

4

I have this expression:

(?:[ \t]*[a-z][)]\s*)?([^\r\n<]+(?:(?:\r?\n(?!\s*[a-z][)])|<(?!br\s*\/?>(?:\s*<br\s*\/?>)*\s*(?:\s+[a-z][)]|\s*$)))[^\r\n<]*)*)(?:<br\s*\/?>\s*)*

What marry this text and remove the letters a), b), c), d), e) and the <brs> just of the end:

<strong>Preencha</strong> a lacuna e assinale a alternativa correta. <br /><br />
I - capacitação técnico-profissional: Comprovação do licitante de possuir em seu quadro permanente, na data prevista para entrega da proposta, ________________, detentor de atestado de responsabilidade técnica por execução de obra ou serviço de características semelhantes, limitadas estas exclusivamente às parcelas de maior relevância e valor significativo do objeto da licitação, vedadas as exigências de quantidades mínimas ou prazos máximos (Lei 8.666/1993 Art N° 30).<br />
<br />
a)<strong>profissional</strong> de nível superior<br />
b)profissional de nível superior ou outro devidamente reconhecido pela entidade competente<br />
c)profissional capacitado<br />
d)profissional de nível minimamente técnico<br />
e)profissional especializado no objeto da <strong>licitação</strong>

Currently it looks like this:

strong>Preencha</strong> a lacuna e assinale a alternativa correta.<br /><br />
I - capacitação técnico-profissional: Comprovação do licitante de possuir em seu quadro permanente, na data prevista para entrega da proposta, ________________, detentor de atestado de responsabilidade técnica por execução de obra ou serviço de características semelhantes, limitadas estas exclusivamente às parcelas de maior relevância e valor significativo do objeto da licitação, vedadas as exigências de quantidades mínimas ou prazos máximos (Lei 8.666/1993 Art N° 30).
a)<strong>profissional</strong> de nível superior
profissional de nível superior ou outro devidamente reconhecido pela entidade competente
profissional capacitado
profissional de nível minimamente técnico
profissional especializado no objeto da <strong>licitação</strong>

Can be viewed here link

But as seen in this link, when inserting some formatting tag at the beginning of the question, or at the beginning of the answers, do not go home. See <strong> as cut return, at the beginning of the question and letter a) that is included in the first answer. It should come clean, like the other answers.

Remembering the question, and each answer I'm picking up separately to insert into a field in the database.

The attempt is to get:

  • Take everything up to (a) and delete all% with only% of the end.
  • Pick up the letter a), b) ... until the next letter excluding all brs just from the end.
  • ASP code. So using, because time is 4 replies, hour 5.

    questao=Request.Form("editor")
    
    Set re = New RegExp'RegEx
    re.Global = true
    re.IgnoreCase = true
    re.Pattern = "(?:[ \t]*[a-z][)]\s*)?([^\r\n<]+(?:(?:\r?\n(?!\s*[a-z][)])|<(?!br\s*\/?>(?:\s*<br\s*\/?>)*\s*(?:\s+[a-z][)]|\s*$)))[^\r\n<]*)*)(?:<br\s*\/?>\s*)*"    
    
    Set matches = re.Execute(questao)
    If (matches.Count) Then
    
        For m = 1 To matches.Count - 1
    
        '4 respsotas
        if (matches.Count-1)=4 then
            pergunta=matches(0).SubMatches(0)
            resposta_a=matches(1).SubMatches(0)
            resposta_b=matches(2).SubMatches(0)
            resposta_c=matches(3).SubMatches(0)
            resposta_d=matches(4).SubMatches(0)
        end if
    
        '5 respostas
        if (matches.Count-1)=5 then
            pergunta=matches(0).SubMatches(0)
            resposta_a=matches(1).SubMatches(0)
            resposta_b=matches(2).SubMatches(0)
            resposta_c=matches(3).SubMatches(0)
            resposta_d=matches(4).SubMatches(0)
            resposta_e=matches(5).SubMatches(0)
        end if
    
        Next
    End If
    Set matches = Nothing
    Set re = Nothing
    
        
    asked by anonymous 31.05.2018 / 16:57

    2 answers

    1

    Why do not you facilitate the code by assembling more than one regular expression, simpler?

    To capture the items in the question,

    Dim patternQuestao = "[a-z]\)(.+?)\<br\s+\/\>"
    

    To capture the title of the question,

    Dim patternTitulo = "((.|[\r\n])+?)[a-z]\)"
    

    And to remove the line break,

    Dim patternQuebra = "\<br\s+\/\>\s*$"
    

    For example, your code could look like this:

    Set r = new RegExp
    r.IgnoreCase = True
    
    '--- coleta o titulo
    Dim titulo
    r.Pattern = patternTitulo
    r.Global = False
    Set matchQuestao = r.Execute(entrada)
    If Not matchQuestao Is Null And matchQuestao.Count = 1 Then
        titulo = matchQuestao.Matches(0).Submatches(0)
    End If
    
    '--- retira as quebras do titulo
    r.Pattern = patternQuebra
    r.Global = True
    titulo = r.Replace(titulo, "")
    
    '--- coleta as questoes
    Dim resposta_a, resposta_b, resposta_c, resposta_d, resposta_e
    r.Pattern = patternQuestao
    r.Global = True
    r.Multiline = True
    Set matchQuestoes = r.Execute(entrada)
    If Not matchQuestoes Is Null And matchQuestoes.Count > 0 Then
        With matchQuestoes
            resposta_a = .Matches(0).Submatches(0)
            resposta_b = .Matches(1).Submatches(0)
            resposta_c = .Matches(2).Submatches(0)
            resposta_d = .Matches(3).Submatches(0)
            If matchQuestoes.Count > 4 Then
                resposta_e = .Matches(4).Submatches(0)
            End If
        End With
    End If
    
    '---- retira as quebras de linha das questoes
    r.Pattern = patternQuebra
    r.Global = True
    resposta_a = r.Replace(resposta_a, "")
    resposta_b = r.Replace(resposta_b, "")
    resposta_c = r.Replace(resposta_c, "")
    resposta_d = r.Replace(resposta_d, "")
    resposta_e = r.Replace(resposta_e, "")
    
        
    31.05.2018 / 20:49
    0

    Regex

    This regular expression resolves the example question: (?:[a-z]\))?([\s\S]+?)(?:<br\s*\/>\s*)?(?=[a-z]{1}\)|$)

    In which group 1 of each match is captured without the start letters of the alternatives.

      

    With global option only (/ g), without multiline (/ m)

    Where the demo on Regex101 can be viewed in this link and Debuggex in this link

    Explanation

    Matches all characters before [a-z]\) , for example: a), b), ..., z), or the end of the string $ .

    Whether or not to start with [a-z]\) and end with <br /> , both outside capture group 1.

        
    06.06.2018 / 13:25