Wystąpiłem następujący regex w bazie kodu firmy.

(?:.*)(\\bKEYWORD\\b(?:\\s+)+(?:.*)+;)(?:.*)

Podział regexa:

  1. Non Chicking Group: (?:.*)

  2. GRUPA ROBIĆ (\\bKEYWORD\\b(?:\\s+)+(?:.*)+;)

    2.1 Non Chresuring Group: (?:\\s+)+

    2.2 Non Chicking Group: (?:.*)+

  3. Non Chicking Group: (?:.*)

Powyższy regex przechodzi w katastrofalne cofanie, gdy nie pasuje do ; lub próbki testowej staje się zbyt długie. Sprawdź poniżej dwóch próbek testowych:

1. --      KEYWORD the procedure if data match between Type 1 and Type 2/3 views is not required.
2. KEYWORD SET MESSAGE_TEXT = '***FAILURE : '||V_G_ERR_MSG_01; /*STATEMENT TO THROW USER DEFINED ERROR CODE AND EXCEPTION TO THE CALLER*/

Poszedłem jednak Runaway Regular Expression Artykuł Aswell i próbował użyć do {{x0 }} Ale nadal nie ma wyników. Czy ktoś może mi pomóc, jak naprawić ten regex?

2
visitor_ 28 październik 2020, 17:30

1 odpowiedź

Najlepsza odpowiedź

Zgodnie z podanym linkiem, są wzory, takie jak (x+x+)+ w wyrażeniu: (?:\\s+)+ i kolejne (?:.*)+. Pierwsze pasuje do jednego lub więcej znaków białych znaków jeden lub więcej razy, a drugi pasuje do nieokreślonej ilości dowolnych znaków jeden lub więcej razy. To nie ma sensu.

Nie są tu niepotrzebne grupy.

Posługiwać się

.*\\b(KEYWORD\\s.*;).*

Zobacz Dowód

Wyjaśnienie

--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    KEYWORD                  'KEYWORD'
--------------------------------------------------------------------------------
    \s                       whitespace (\n, \r, \t, \f, and " ")
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    ;                        ';'
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))
3
Ryszard Czech 28 październik 2020, 22:43