我目前正在使用以下代码来解析Xml文件的一部分(我首先将整个文件读入一个字符串).
for xmlMatch in xmlString:gmatch("<MyXmlElement.*</MyXmlElement>") do
-- Do something.
end
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是for循环只执行一次,因为gmatch函数只返回一个字符串,该字符串从MyXmlElement的第一个实例开始,并在MyXmlElement的最后一个实例的闭包处结束.我怎样才能解析字符串,以便在匹配模式每当字符串"</MyXmlElement>"是第一个发现(而不是只有最后一种情况)?
我需要从一个更大的字符串中检测出一个单词说约翰,说约翰是个好男人 所以我有这个模式来找到这个词
[j][o][h][n]
Run Code Online (Sandbox Code Playgroud)
并按如下方式使用:
local pattern = "[j][o][h][n]"
local str = "john is a good man"
print(str:find(pattern))
Run Code Online (Sandbox Code Playgroud)
为了接受字母多次出现(例如jooohn是一个好人),我将模式修改为
[j]+[o]+[h]+[n]+
Run Code Online (Sandbox Code Playgroud)
我需要忽略可能出现在单词之间的空格(或其他非字母字符)(例如joh; n是一个好人),所以我在每个字母中加上[^ az]*,结果模式是
[j]+[^a-z]\*[o]+[^a-z]\*[h]+[^a-z]\*[n]+[^a-z]\*
Run Code Online (Sandbox Code Playgroud)
现在这对于"jooh!n is a good man"这样的词来说是完美的.但如果!符号出现在重复的字母内,模式失败.例如,在jo!ohn是一个好人,没有检测到模式.如何修改模式以实现此目的?
编辑
例:
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))
Run Code Online (Sandbox Code Playgroud)
这将打印
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))
Run Code Online (Sandbox Code Playgroud)
只打印nil
我需要一个允许我在场景2中检测到joo!ohn的模式
我有一个功能,需要检查特殊字符并在找到特殊字符时将其破坏。
这是我尝试过的。
local text = "h!ello\"wor%ld_t@xt.p^*sp&ki#$te"
if (string.match(text, "&") ~= nil) then
print("Invalid Character \n")
end
if (string.match(text, "\"") ~= nil) then
print("Invalid Character \n")
end
if (string.match(text, "#") ~= nil) then
print("Invalid Character \n")
end
if (string.match(text, "$") ~= nil) then
print("Invalid Character \n")
end
if (string.match(text, "@") ~= nil) then
print("Invalid Character \n")
end
if (string.match(text, "%%") ~= nil) then
print("Invalid Character \n")
end
if (string.match(text, "!") ~= nil) then
print("Invalid Character \n")
end
if (string.match(text, "^") ~= …Run Code Online (Sandbox Code Playgroud) 给定是一个(时间 - 值)字符串,如:
local dt = "12:34:56"
Run Code Online (Sandbox Code Playgroud)
我想把这个字符串剪成
hh, mm, ss = "12", "34", "56"
Run Code Online (Sandbox Code Playgroud)
因此我使用这样的正则表达式:
local hh = string.format("%02d", tonumber( dt:gsub(":..:..","") ))
local mm = string.format("%02d", tonumber( dt:gsub(":..:",""):gsub(":","") ))
local ss = string.format("%02d", tonumber( dt:gsub("..:..:","") ))
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.(时间字符串来自userinput,所以如果用户写"1"而不是"01",我将其填充为0)
但是在值从0开始的情况下,它超出了luas tonumber()的范围(我猜是签名为零),与"1"相同,tonumber()似乎不能处理低于"2"的值.)任何人都可以告诉我该如何处理这种情况?
除此之外,如果你能告诉我正则表达式中的不良练习,我会很高兴,如果有的话.
我有一个用lua编写的配置文件解析器.
我想检测作为环境变量的值并使用os.getenv更改它们.
这可能有点雄心勃勃,因为我可以拥有像这样的价值观
"a string with an embedded ${VARIABLE} in here"
Run Code Online (Sandbox Code Playgroud)
要么
"another string with an env $VARIABLE"
Run Code Online (Sandbox Code Playgroud)
而且我应该允许使用double $$来逃避它们以允许文字$.
我该怎么做呢?
这是我到目前为止所做的,但这是不对的
local envvar = string.match(value, "%$([%w_]+)")
if envvar then
print("Envvar=", envvar)
value = value:gsub("(%$[%w_]+)", os.getenv(envvar))
end
Run Code Online (Sandbox Code Playgroud)
例如,我无法弄清楚如何在此处使用%b余额选项来正确匹配{}组合.并使它们可选.如何稳健地完成这项工作?
事实上,我意识到它可能比这更复杂.如果指定了多个环境变量怎么办?
所以这里有一个简单的例子,比如我有一个类似的方程式
local equation = "((5*2)+3)-(3^5)"
Run Code Online (Sandbox Code Playgroud)
而且我想抓住 "((5*2)+3)"
起初我试过了
equation:match("%((.*)%)")
Run Code Online (Sandbox Code Playgroud)
但是*贪婪,所以它抓住了整个方程式.
然后我试了一下
equation:match("%((.-)%)")
Run Code Online (Sandbox Code Playgroud)
但是-很懒惰,它被捕获了"((5*2)"
显然,我错了.我应该如何用字符串模式捕获括号?
我目前正在使用此正则表达式来松散地验证DNS地址:
^[A-Za-z0-9_]+(\.[A-Za-z0-9_]+)*$
Run Code Online (Sandbox Code Playgroud)
这将匹配之类的东西hello.com,hello和hello.com.com.com.我试图将它完全复制到Lua模式中.我提出了以下Lua模式:
^([%d%a_]+(%.[%d%a_]+)*)$
Run Code Online (Sandbox Code Playgroud)
这样我就可以使用以下代码来验证DNS地址:
local s = "hello.com"
print(s:match("^([%d%a_]+(%.[%d%a_]+)*)$"))
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这总是失败,虽然它看起来像正则表达式的1:1副本.
有什么想法吗?
出于某种原因,只有开放和关闭支架不会工作,其他所有都很好.
RequestEncoded = string.gsub(RequestEncoded, '<', ' ')
RequestEncoded = string.gsub(RequestEncoded, '>', ' ')
RequestEncoded = string.gsub(RequestEncoded, '"', ' ')
RequestEncoded = string.gsub(RequestEncoded, '\'', ' ')
RequestEncoded = string.gsub(RequestEncoded, '\\', ' ')
-- RequestEncoded = string.gsub(RequestEncoded, '(', ' ') keeps failing
-- RequestEncoded = string.gsub(RequestEncoded, ')', ' ')
-- RequestEncoded = string.gsub(RequestEncoded, "\x28", " ") --keeps failing
-- RequestEncoded = string.gsub(RequestEncoded, "\x29", ' ')
-- RequestEncoded = string.gsub(RequestEncoded, '\050', ' ') --keeps failing
-- RequestEncoded = string.gsub(RequestEncoded, '\051', ' ')
Run Code Online (Sandbox Code Playgroud) 我想替换花括号,它的意思是something in here {uid} {uid2}to something in here :id :id。
我尝试了以下方法:
local v = "something in here {uid} {uid2}"
local regex = "^{([^}]+)}"
print(v:gsub(v:match(regex), ":id"):gsub("{", ""):gsub("}", ""))
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。但是,当我删除“这里的东西”时,它确实起作用。请帮忙。
%w 和 %W 如下所示: Str = string.gsub(Str, \xe2\x80\x9c%f[%w]cat%f[%W]\xe2\x80\x9d
小 %w 和大 %W 有什么区别?
\n以下是更多示例: for _ in string.gmatch(\xe2\x80\x9c\\n\xe2\x80\x9d .. Str .. \xe2\x80\x9c\\n\xe2\x80\x9d, \xe2\x80\x9c%Wcat%W\xe2\x80\x9d) do ,
if Pos1 == 0 or string.find(Str, \xe2\x80\x9c^%W\xe2\x80\x9d, Pos1) then
我知道 %w 匹配单词字符
\n所以我希望 %W 匹配大写单词字符?
\n