2016-06-20 3 views
1

Мне нужно регулярное выражение для использования в string.gmatch, которое соответствует последовательностям буквенно-цифровых символов и не буквенно-цифровых символов (кавычки, скобки, двоеточия и т. П.) Как разделенные, одиночные, совпадения , так что в основном:Regex для соответствия токенам в строке с использованием string.gmatch

str = [[ 
    function test(arg1, arg2) { 
     dosomething(0x12f, "String"); 
    } 
]] 

for token in str:gmatch(regex) do 
    print(token) 
end 

Если печать:

function 
test 
(
arg1 
, 
arg2 
) 
{ 
dosomething 
(
0x121f 
, 
" 
String 
" 
) 
; 
} 

Как я могу добиться этого? В стандартном регулярном выражении я обнаружил, что ([a-zA-Z0-9]+)|([\{\}\(\)\";,]) работает для меня, но я не уверен, как перевести это в регулярное выражение Lua.

ответ

1
local str = [[ 
    function test(arg1, arg2) { 
     dosomething(0x12f, "String"); 
    } 
]] 

for p, w in str:gmatch"(%p?)(%w*)" do 
    if p ~= "" then print(p) end 
    if w ~= "" then print(w) end 
end 
+0

Что соответствует '% p'? – user6245072

+0

'% w' - буквенно-цифровой,'% p' - пунктуация (пунктуация - это все ASCII7, кроме буквенно-цифровых, пробелов и управляющих символов) –

+0

Это действительно полезно - я мог бы, например, добавить все токены в таблицу, а затем обработать их, но как я могу сохранить в уникальных токеновных строках, разделенных символом '' '? – user6245072

1

Вам необходимо обходное решение с временным символом, который не используется в вашем коде. Например, используйте §, чтобы вставить его после того, как буквенно-цифровые и не буквенно-цифровых символов:

str = str:gsub("%s*(%w+)%s*", "%1§") -- Trim chunks of 1+ alphanumeric characters and add a temp char after them 
str = str:gsub("(%W)%s*", "%1§")  -- Right trim the non-alphanumeric char one by one and add the temp char after each 
for token in str:gmatch("[^§]+") do -- Match chunks of chars other than the temp char 
    print(token) 
end 

См this Lua demo

Обратите внимание, что %w в Lua является эквивалентом JS [a-zA-Z0-9], так как он не соответствует подчеркивание, _.

Смежные вопросы