Строка Луа.матч использует нерегулярные регулярные выражения?



Мне любопытно, почему это не работает, и нужно знать, почему/как обойти это; я пытаюсь определить, является ли какой-то вход вопросом, я уверен, что строка.матч - это то, что мне нужно, но:



print(string.match("how much wood?", "(how|who|what|where|why|when).*\?"))



Возвращает nil. Я почти уверен, что это строка Луа.match использует регулярные выражения для поиска совпадений в строке, как я использовал подстановочные знаки (.) раньше с успехом, но, может быть, я не понимаю всей механики? Луа не требует специальных разделителей в строке функций? Я проверил мое регулярное выражение здесь , так что если Lua использует регулярные регулярные выражения, то, похоже, приведенный выше код вернет "how much wood?".



Может ли кто-нибудь из вас сказать мне, что я делаю неправильно, что я собираюсь делать, или указать мне хорошую ссылку, где я могу получить исчерпывающую информацию о том, как функции обработки строк Lua используют регулярные выражения?

530   2  

2 ответов:

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

.* будет также потреблять последний ? из входных данных, так что он терпит неудачу на \\?. Вопросительный знак следует исключить. Специальные символы экранируются с помощью %.

"how[^?]*%?"
Как сказал Омри Барел, нет никакого оператора чередования. Вероятно, вам нужно использовать несколько шаблонов, по одному для каждого альтернативного слова в начале предложения. Или вы можете использовать библиотеку, которая поддерживает регулярное выражение например, выражения.

Согласно руководству , шаблоны не поддерживают чередование.

Так что пока "how.*" работает, "(how|what).*" нет.

И капеп прав насчет того, что вопросительный знак проглатывается .*.

Есть связанный с этим вопрос: Lua pattern matching vs regular expressions.

Comments

    Ничего не найдено.