带有可选组的正则表达式不起作用 - \d 在括号中不起作用 (\d*%)
Regex with optional groups not working - \d is not working in the parenthesis (\d*%)
我需要为以下规则编写正则表达式,其中按钮 (a、b、开始) 是唯一必需的字段,所有其他组都是可选的但有问题。还需要一些后视逻辑,我也遇到了问题
- 此正则表达式适用于带按钮的虚拟游戏控制器。其中一些按钮是 "a"、"b," 和 "start"。
- 每个按钮都可以附加持续时间,但这不是必需的。 "a500ms" 将按下 A 按钮 500 毫秒。 "a1s" 将按下 A 键 1 秒。
- 按钮可以按顺序按下,没有空格。 "ab" 按 A,然后按 B。"astart" 按 A,然后按开始。
- 解析器语法如下:(修饰符)(按钮)(百分比)(百分比符号)(持续时间)(持续时间类型)(附加)
- (button) 是唯一需要的组。其他一切都是可选的。
- 如果(百分比符号)没有(百分比)或(持续时间类型)没有(持续时间),则无效
- 使用完整语法的完整示例:“_start20%12ms+”
- 这将 "start" 保持 20%,持续 12 毫秒,并追加稍后的输入
示例:
- "a600msb200ms" - 有效
- "ams500b" - 无效,因为(持续时间类型)("ms")之前没有(持续时间)(“500”)
- "astart" - 按 A 然后开始(这目前在我的正则表达式中不起作用,但它应该)
- "b1sstart" - 按 B 1 秒然后开始
- "b+a" - 同时按下 B 和 A
- "_b a" - 按住 B 然后按下 A
我的正则表达式:
^(a|b|start)(\d*%)?(\d*(s|ms))?
这里是测试台https://regex101.com/r/jGf0VR/3
问题
由于以下问题,正则表达式对我不起作用
(\d*%)?
- 这个组不工作,假设捕获 500%、200% 但它不工作(是的,用反斜杠尝试它仍然不起作用)。事实上它应该是可选的但它永远不会被视为可选
a200ms300s
- 应该被捕获但没有被捕获,同样a200s300ms
也应该被捕获
a200ms200%
- 应该是无效的,我似乎无法解决这个问题,主要是因为 (\d*%)?
对我不起作用,如 prob1[=17= 中突出显示的那样]
使用以下匹配包含单个按钮按下的字符串:
^(a|b|start)(\d+%)?(\d+(s|ms))?$
我把\d*
改成了\d+
,表示在%
或s|ms
之前至少需要一位数字。我在最后添加了 $
,所以如果匹配后有额外的东西,它就不会匹配。
要匹配它们的序列,请围绕除锚点之外的所有内容放置一个组,并允许它重复。
^((a|b|start)(\d+%)?(\d+(s|ms))?)+$
我需要为以下规则编写正则表达式,其中按钮 (a、b、开始) 是唯一必需的字段,所有其他组都是可选的但有问题。还需要一些后视逻辑,我也遇到了问题
- 此正则表达式适用于带按钮的虚拟游戏控制器。其中一些按钮是 "a"、"b," 和 "start"。
- 每个按钮都可以附加持续时间,但这不是必需的。 "a500ms" 将按下 A 按钮 500 毫秒。 "a1s" 将按下 A 键 1 秒。
- 按钮可以按顺序按下,没有空格。 "ab" 按 A,然后按 B。"astart" 按 A,然后按开始。
- 解析器语法如下:(修饰符)(按钮)(百分比)(百分比符号)(持续时间)(持续时间类型)(附加)
- (button) 是唯一需要的组。其他一切都是可选的。
- 如果(百分比符号)没有(百分比)或(持续时间类型)没有(持续时间),则无效
- 使用完整语法的完整示例:“_start20%12ms+”
- 这将 "start" 保持 20%,持续 12 毫秒,并追加稍后的输入
示例:
- "a600msb200ms" - 有效
- "ams500b" - 无效,因为(持续时间类型)("ms")之前没有(持续时间)(“500”)
- "astart" - 按 A 然后开始(这目前在我的正则表达式中不起作用,但它应该)
- "b1sstart" - 按 B 1 秒然后开始
- "b+a" - 同时按下 B 和 A
- "_b a" - 按住 B 然后按下 A
我的正则表达式:
^(a|b|start)(\d*%)?(\d*(s|ms))?
这里是测试台https://regex101.com/r/jGf0VR/3
问题
由于以下问题,正则表达式对我不起作用
(\d*%)?
- 这个组不工作,假设捕获 500%、200% 但它不工作(是的,用反斜杠尝试它仍然不起作用)。事实上它应该是可选的但它永远不会被视为可选a200ms300s
- 应该被捕获但没有被捕获,同样a200s300ms
也应该被捕获a200ms200%
- 应该是无效的,我似乎无法解决这个问题,主要是因为(\d*%)?
对我不起作用,如 prob1[=17= 中突出显示的那样]
使用以下匹配包含单个按钮按下的字符串:
^(a|b|start)(\d+%)?(\d+(s|ms))?$
我把\d*
改成了\d+
,表示在%
或s|ms
之前至少需要一位数字。我在最后添加了 $
,所以如果匹配后有额外的东西,它就不会匹配。
要匹配它们的序列,请围绕除锚点之外的所有内容放置一个组,并允许它重复。
^((a|b|start)(\d+%)?(\d+(s|ms))?)+$