正则表达式用于匹配逗号前面的单词(Lua)

时间:2019-05-06 05:31:52

标签: regex string split lua

我要定位的文字部分始终以“还存在”开头,并以句点结尾。逗号之间的单个名称是我要定位的目标(即下面的示例中的“ randomperson”。这些名称将始终是不同的。这很棘手,因为存在其他不是单个单词“ names”的事物。也许只有一个单词/名称,我才能匹配逗号之间的所有内容,但我似乎无法弄清楚,名称列表可能更长或更短,因此表达式必须是动态的,而不仅仅是匹配设置名称数量。

目标文字:

  

还有一面加固的石墙,一面木墙,一堵石墙,   随机人,笨拙的地球元素,随机人,随机人,   随便的人。

第1组,Also there is (.*).

定位“ is”之后的所有内容,但随后我需要以某种方式隔离单个单词。

如何解决此问题?

2 个答案:

答案 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

该语法显然只能解析经过简化的清单,但它可以满足您的基本要求,并且可以轻松扩展。