Переписывание регулярного выражения javascript в php, когда регулярное выражение имеет выход - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь записать свое регулярное выражение в виде строки (это часть моего токенайзера S-Expression, который сначала разбивается на строки, регулярные выражения и комментарии lisp, а затем разбивает вещи между ними), он работает в https://regex101.com/r/nH4kN6/1/, но есть проблема, чтобы написать его как строку для php.

Мои регулярные выражения JavaScript выглядят так:

var pre_parse_re = /("(?:\\[\S\s]|[^"])*"|\/(?! )[^\/\\]*(?:\\[\S\s][^\/\\]*)*\/[gimy]*(?=\s|\(|\)|$)|;.*)/g;

Я пытался написать это регулярное выражение в php (один из Regex101 был внутри одинарной кавычки).

$pre_parse_re = "%(\"(?:\\[\\S\\s]|[^\"])*\"|/(?! )[^/\\]*(?:\\[\\S\\s][^/\\]*)*/[gimy]*(?=\\s|\\(|\\)|$)|;.*)%";

Мой вклад

'(";()" /;;;/g baz); (baz quux)'

при вызове:

$parts = preg_split($pre_parse_re, $str, -1,
                    PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

он должен создать тот же массив, что и в Regex101 (3 совпадения и прочее между ними), но он продолжает разделяться на первую точку с запятой внутри регулярного выражения /;;;/g

1 Ответ

2 голосов
/ 11 мая 2019

Я думаю, что вы могли сбежать неправильноВместо этого попробуйте это регулярное выражение:

$pre_parse_re = "%(\"(?:\\\\[\\\\S\\\\s]|[^\"])*\"|\/(?! )[^\/\\\\]*(?:\\\\[\S\s][^\/\\\\]*)*\/[gimy]*(?=\s|\(|\)|$)|;.*)%";

Использование preg_split может также вернуть больше, чем вы хотите групп захвата, так что вы также можете изменить его на использование, если вы просто хотите 3 совпадения.

$parts;
preg_match_all($pre_parse_re, $str, $parts, PREG_SET_ORDER, 0);
...