我要定位的文字部分始终以“还存在”开头,并以句点结尾。逗号之间的单个名称是我要定位的目标(即下面的示例中的“ randomperson”。这些名称将始终是不同的。这很棘手,因为存在其他不是单个单词“ names”的事物。也许只有一个单词/名称,我才能匹配逗号之间的所有内容,但我似乎无法弄清楚,名称列表可能更长或更短,因此表达式必须是动态的,而不仅仅是匹配设置名称数量。
还有一面加固的石墙,一面木墙,一堵石墙, 随机人,笨拙的地球元素,随机人,随机人, 随便的人。
第1组,Also there is (.*).
定位“ is”之后的所有内容,但随后我需要以某种方式隔离单个单词。
如何解决此问题?
答案 0 :(得分:1)
您可以这样做:
s = "Also there is a reinforced stone wall, a wooden wall, a stone wall, randomperson, a lumbering earth elemental, randomperson, randomperson, randomperson."
str = s:sub(15,-2)
things = {}
start = 1
while true do
a, b = str:find("[^,]+", start)
if not a then break end
table.insert(things, str:sub(a, b))
start = b + 3
end
for _,thing in ipairs(things) do print("-> " .. thing) end
输出
-> a reinforced stone wall
-> a wooden wall
-> a stone wall
-> randomperson
-> a lumbering earth elemental
-> randomperson
-> randomperson
-> randomperson
或者安装一个luockcks模块split,它很简单
split = require("split")
things = split.split(s:sub(15,-2), ", ")
使用gmatch
:
for thing in s:sub(14, -2):gmatch("%f[%S][^,]+") do print(thing) end
我在这里使用“边界”模式来丢弃逗号后面的空格。
答案 1 :(得分:0)
我不确定问题的方向,但是对于正则表达式来说问题可能太复杂了,更不用说Lua模式了。由于我喜欢语法-这是一些LPeg:
local l = require "lpeg";
local V, P, R, S = l.V, l.P, l.R, l.S;
local OUT = function(T, ... ) return function(...) print(T, ...) end end
local g = P{ "S",
S = 'Also there is ' * V'List' * '.',
List = V'Item' * (P',' * ' ' * V'Item')^0,
Item = V'Specific_Noun' + V'Name',
Name = V'Word' /OUT'Name',
Specific_Noun = (P'a' + 'an') * ' ' * (V'Word' * ' ')^0 * V'Noun',
Noun = V'Word' /OUT'Noun',
Word = R('az','AZ')^1,
}
g:match("Also there is a reinforced stone wall, a wooden wall, a stone wall, "..
"randomperson, a lumbering earth elemental, randomperson, randomperson, rando"..
"mperson, Karl, Greta, a mile.")
示例输出:
Noun wall
Noun wall
Noun wall
Name randomperson
Noun elemental
Name randomperson
Name randomperson
Name randomperson
Name Karl
Name Greta
Noun mile
该语法显然只能解析经过简化的清单,但它可以满足您的基本要求,并且可以轻松扩展。