Регулярное выражение для поиска групп соответствия для 1 обратного удара и 3 обратных ударов - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь найти регулярное выражение, совпадающее с внутренними частями обратного удара, 1 или 3.

У меня есть следующее регулярное выражение, которое работает для 1 обратного удара:

`(.*?)`

и этот работает с 3:

```(.*?)```

Я хочу объединить их в один поиск по регулярному выражению, я пробовал что-то вроде

(`|```)(.*?)(`|```)

Но это создает слишком много групп соответствия , Я пробовал $ и ^, но, похоже, это начало строки и конец строки ...

Крайний случай 1:

My SQL Statement is below:
```
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";
```

должен иметь 1 группу с:

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";

Край 2

My SQL Statement is below:
```
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";
```

```
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 2";
```

Должно иметь 2 группы:

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";

и

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 2";

Пограничный регистр 3

My SQL Statement is below:
```
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 2";
```

Должен иметь 1 группу:

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";
SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 2";

Должен поместить весь блок в группу


Край Дело 4

SQL_STATEMENT = "SELECT * FROM `table` WHERE `id` = 1";

Должно иметь 2 группы

table

и

id

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

Захватите 1 или 3 обратных меток и используйте обратную ссылку в конце, поэтому необходимо их сбалансировать.

Простая версия:

(`(?:``)?)([^`]+)\1

Только с балансировкой версия. (ie количество обратных галочек одинаково в начале и в конце)

(?<=[^`]|^)(`(?:``)?)([^`]+)\1(?=[^`]|$)

Ваша цель (содержимое) находится в группе 2

См. live demo .

1 голос
/ 01 мая 2020

Вот несколько способов сделать это.

Соответствие строк

(?<=(?<!`)`)[^`\r\n]+(?=`(?!`))|(?<=(?<!`)```)[^`\r\n]+(?=```(?!`))

Обратите внимание, что это регулярное выражение не имеет групп захвата.

PCRE (PHP) Демонстрация

Механизм регулярных выражений PCRE выполняет следующие операции.

(?<=       begin a positive lookbehind
  (?<!`)   following is not preceded by a backtick
  `        match a backtick
)          end positive lookbehind
[^`\r\n]+  match 1+ chars other than backtick, CR or newline
(?=        begin positive lookahead
  `        match a backtick
  (?!`)    not followed by a backtick
)          end positive lookhead
|
(?<=       begin a positive lookbehind
  (?<!`)   following is not preceded by a backtick
  ```      match 3 backticks
)          end positive lookbehind
[^`\r\n]+  match 1+ chars other than backtick, CR or newline
(?=        begin positive lookahead
  ```      match 3 backticks
  (?!`)    not followed by a backtick
)          end positive lookhead

(?<!...) является отрицательным взглядом позади ; (?!...) является негативным прогнозом .

Использование групп захвата

(?<!`)`([^`\r\n]+)`(?!`)|(?<!`)```([^`\r\n]+)```(?!`)

PCRE (PHP) Демонстрация

Вы увидите, что это регулярное выражение имеет две группы захвата. Там, где есть совпадение с одним обратным трюком, часть между обратными чертами удерживается в группе захвата 1, а группа захвата 2 не создается, а там, где есть совпадение с тремя обратными ударами, часть между тройками обратных ударов удерживается в группе захвата 2. и группа захвата 1 не создана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...