Запрос шаблонов Lua

Мне нужно определить слово, скажем, джон из большей строки, скажем, джон — хороший человек, поэтому у меня есть этот шаблон, чтобы найти слово

[j][o][h][n]

и используйте его следующим образом:

local pattern = "[j][o][h][n]"
local str = "john is a good man"
print(str:find(pattern))


Чтобы принять, если буквы встречаются несколько раз (например, джухн — хороший человек), я изменяю шаблон следующим образом:

[j]+[o]+[h]+[n]+

Мне нужно игнорировать пробелы (или другие небуквенные символы), которые могут встречаться между словами (например, joh;n is a good man), поэтому я добавляю [^az]* к каждой букве, а шаблон результата

[j]+[^a-z]\*[o]+[^a-z]\*[h]+[^a-z]\*[n]+[^a-z]\*

Теперь это идеально подходит для такого слова, как «джух!н хороший человек». Но если в повторяющейся букве встречается символ !, шаблон не работает. Например, в Джон — хороший человек закономерность не обнаружена. Как изменить шаблон, чтобы добиться этого?

ИЗМЕНИТЬ

Пример:

local str = "jooohn is a good man"
local pattern = "[j]+[^a-z]*[o]+[^a-z]*[h]+[^a-z]*[n]+[^a-z]*"
print(str:find(pattern))

это напечатает 1 7

Но

 local str = "joo!ohn is a good man"
 local pattern = "[j]+[^a-z]*[o]+[^a-z]*[h]+[^a-z]*[n]+[^a-z]*"
 print(str:find(pattern))

напечатает только nil Мне нужен шаблон, который позволит мне обнаружить joo!ohn в сценарии 2


person SatheeshJM    schedule 20.11.2012    source источник
comment
Чего вы пытаетесь достичь?   -  person lhf    schedule 20.11.2012
comment
@lhf шаблон, который я прошу, будет использоваться для поиска строки john или модифицированного варианта john из большой строки .. имеет ли это смысл? Я также обновил вопрос!   -  person SatheeshJM    schedule 20.11.2012


Ответы (1)


Это должно сделать "j[j%W]*o[o%W]*h[h%W]*n[n%W]*":

local str = "joo!ohn is a good man"
local pattern = "j[j%W]*o[o%W]*h[h%W]*n[n%W]*"
print(str:find(pattern))

печатает 1 8.

person Paul Kulchenko    schedule 20.11.2012
comment
Большое спасибо! это работает! но я понятия не имею как. Не могли бы вы объяснить это немного Пол? - person SatheeshJM; 20.11.2012
comment
хорошо, я понял.. The upper cased version of the above reverses the meaning of said (i.e. %A --- represents all non-letters). Итак, мы ищем 0 или более [не буквенно-цифровых символов или одной и той же буквы] большое спасибо, Пол!!! - person SatheeshJM; 20.11.2012
comment
И поскольку мне нужны только буквы (в отличие от буквенно-цифровых), я бы заменил %W на %A! - person SatheeshJM; 20.11.2012
comment
@SatheeshJM, да, ты правильно понял. И предлагаемое изменение тоже должно сработать. - person Paul Kulchenko; 21.11.2012