String 字符串中可能包含的字符的模式

String 字符串中可能包含的字符的模式,string,lua,lua-patterns,String,Lua,Lua Patterns,我知道我应该使用string.match()来执行此操作,但我在匹配字符串中“可能”的字符时遇到了问题,例如: teststring = "right_RT_12" 我可以很容易地做一些事情,比如: string.match(teststring , 'righteye_RT_[0-9]+') re.search("righteye_RT(_[0-9]+)?", teststring) 如果测试字符串的末尾总是有“[0-9]+,这是可以的,但是可能有一个例子,在末尾没有数字。在Lua中,

我知道我应该使用
string.match()
来执行此操作,但我在匹配字符串中“可能”的字符时遇到了问题,例如:

teststring = "right_RT_12" 
我可以很容易地做一些事情,比如:

string.match(teststring , 'righteye_RT_[0-9]+')
re.search("righteye_RT(_[0-9]+)?", teststring)
如果测试字符串的末尾总是有“[0-9]+,这是可以的,但是可能有一个例子,在末尾没有数字。在Lua中,我将如何处理这个问题

在Python中,我可以执行以下操作:

string.match(teststring , 'righteye_RT_[0-9]+')
re.search("righteye_RT(_[0-9]+)?", teststring)
我认为这样做会奏效:

string.match(teststring, 'righteye_RT_?[0-9]+?')
但事实并非如此。结果=
nil

但是,以下方法确实有效,但只找到第一个数字:

string.match(teststring, 'righteye_RT_?[0-9]?')
试试这个:

string.match(teststring, 'righteye_RT_?%d*$')

请注意字符串锚点的结尾
$
。如果没有它,
%d*
将匹配空字符串,因此整个模式将匹配类似
右眼垃圾

只能用于Lua模式中的一个字符。您可以使用
来匹配两个模式:

local result  = string.match(teststring , 'righteye_RT_%d+') 
             or string.match(teststring , 'righteye_RT')

请注意,
运算符短路。因此,当且仅当它失败时,它会首先尝试匹配第一个模式(返回
nil
),它将尝试匹配第二个模式。

这很有效,谢谢!但是为什么这个有效,而%d+?不起作用?我以为$只搜索字符串末尾的字符?
%d+
不起作用,因为它至少需要一个数字。我知道,所以%d*也可以,但是?作为%d*扔掉了?仍然不起作用。@iGwok Bu不要太在意。那个模式匹配
righteye\u RT\u
string,这可能不合适。它确实匹配“righteye\u RT”,但也匹配“righteye\u RT”,因为?我喜欢这样。难道不可能像python的正则表达式那样在一行中做到这一点:“(righteye\u RT%d+;righteye\u RT)“@iGwok Lua模式不支持
|
,所以不,至少不是这样。