Что такое регулярный эквивалент ".-" в сопоставлении с образцом Lua? - PullRequest
3 голосов
/ 30 июня 2019

Я портирую некоторый код Lua на JS и до сих пор не работал с Lua. Есть шаблон Lua "^([^aeiouàèéêíòóôúïü]*)(.-)$", и я нашел следующее объяснение дефиса здесь :

- Сопоставьте предыдущий символ (или класс) ноль или более раз, как можно меньше раз.

Я пытаюсь выяснить, каким будет эквивалент регулярного выражения. Кроме того, я не понимаю, зачем это вообще нужно - не хватит ли окончания (.*)$

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

В Java .- на самом деле эквивалентно [\s\S]*? или (?s).*?, или - для безопасности - (?s:.*?), потому что . в шаблонах Lua соответствует любому символу (включая символы разрыва строки) и - - это ленивый (не жадный) квантификатор, который соответствует 0 или более символам, то есть *? в регулярном регулярном выражении NFA.

См. Шаблоны Lua :

. all characters

А затем

Модификатор `+´ соответствует одному или нескольким символам исходного класса.Он всегда получит самую длинную последовательность, которая соответствует шаблону.Модификатор `*´ похож на `+´, но также принимает нулевые вхождения символов класса ...Как и `*´, модификатор `-´ также соответствует нулю или большему количеству вхождений символов исходного класса.Однако вместо сопоставления самой длинной последовательности она соответствует самой короткой.

0 голосов
/ 01 июля 2019

На самом деле, этот шаблон во многом эквивалентен соответствующему регулярному выражению во многих языках.Javascript, похоже, не имеет квантификатора -, но вы должны иметь возможность заменить его на .*, и он все равно должен работать.

Попробуйте "^([^aeiouàèéêíòóôúïü]*)(.*)$"

Конечно, вы можететакже проверьте это в Lua REPL:

Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> orig = '^([^aeiou]*)(.-)$'
> modif = '^([^aeiou]*)(.*)$'
> ("jhljkhaaaasjkdf"):match(orig)
jhljkh  aaaasjkdf
> ("jhljkhaaaasjkdf"):match(modif)
jhljkh  aaaasjkdf
> -- QED
...