在正则表达式中如何用“。”分割并匹配第一组数字?

In regex how to split by "." and match the first block of digits?

我很少使用正则表达式,只有当它出现在项目中时。我试图学习,但我被困住了。任何帮助将不胜感激!

预期行为

FNBR6.03202021.Default_Title.mp4 GEVY230.03182021.Project76.mp4
FNBR GEVY
6 230
03202021 03182021
Default_Title Project76
mp4 mp4

示例数组:[FNBR, 6, 03202021, Default_Title, mp4]

我有什么

我已经走到这一步了:/(^.+?(?=\d))|(\d+)|([^.]+)/gm

Expression Description
^.+?(?=\d) This should match everything up until a digit.
(\d+) This should match digits in blocks (next to each other).
([^.]+) This should match everything except .

所以我尝试使用 | OR 运算符将它们放在一起。我得到了一个这样的列表 [FNBR, 6, ., 30202021, .Default_Title.mp, 4, ]。这是我期待的,但我不知道如何继续。

我知道我基本上需要 ([^.]+) 所做的,除了第一个数字块。我只关心在第一个 . decimal/period 之前分隔第一个数字块。所以在 FNBR6.03202021.Default_Title.mp4 中我只关心将 FNBR6 分成 FNBR6,之后一切都像正常一样使用 .

拆分

我没有使用像 Python 或 Java 这样的标准编程语言;必须使用两个正则表达式来执行此操作会很麻烦。就像用 . 拆分所有内容,然后单独拆分 FNBR6 的索引 [0] 一样。我不要那个。

如有任何帮助、反馈和批评,我们将不胜感激!我尽量不让这太长,但我也想确保我彻底解释了情况。谢谢!

编辑 1:有用的建议

@41686d6564 指出我应该提到我使用的平台。我正在测试 Microsoft Power Automate Desktop 的工作情况。这就是我 运行 中的正则表达式。

@trincot 在评论中列出了一堆非常有用的示例。但是,其中 none 个似乎在此程序中正常工作。

使用/(^.+?(?=\d))|(\d+)|([^.]+)/gm

使用任何 trincot 的例子,如 [A-Z]{2,}|\w+ 给出:

编辑 2:可靠答案

@knittl 的示例工作可靠,并按需工作。他们的解构和解释也很有帮助。谢谢!
使用正则表达式创建列表时,Power Automate 似乎使第一个和最后一个索引为空。我只是简单地删除了第一个和最后一个索引。

我试过每个人的 comments/suggestions 按照发布的顺序。 knittl 是第一个运行可靠的。我要感谢大家的快速、周到的帮助!谢谢大家!

这听起来并不复杂。当人们在不需要时开始使用前瞻和后视时,它只会变得复杂。根据给定的信息,各部分可以直接用简字类和量词

进行匹配

输入:FNBR6.03202021.Default_Title.mp4

正则表达式:

([^0-9]+)([0-9]+)\.([0-9]+)\.([^.]+)\.(.+)

解构:

  • ([^0-9]+) 匹配任意数量的非数字并在第 1 组中捕获(但至少匹配一个字符)
  • ([0-9]+) 匹配任意数量的数字并在第 2 组中捕获(至少 1 个数字)
  • \. 匹配一个文字点
  • ([0-9]+) 匹配任意数量的数字并在第 3 组中捕获(至少 1 个数字)
  • \. 匹配一个文字点
  • ([^.]+) 匹配第 4 组中任意数量的非点和捕获字符(至少一个字符)
  • \. 匹配一个文字点
  • (.+) 匹配第 5 组中的其余输入和捕获。可以是任何内容(但同样:至少 1 个字符)

regex101 上在线试用。

注意。根据您的正则表达式风格,[0-9] 可以缩短为 \d 并且 [^0-9] 可以替换为 \D,结果是:(\D+)(\d+)\.(\d+)\.([^.]+)\.(.+)

或者如果已经可以将字符串拆分成一个array/multiple变量,先拆分,再应用正则表达式(伪代码):

var allparts = input.split('.');
var firstpart = part[0].match(/^(\D+)(\d+)$/);
// firstpart[0] = FNBR
// firstpart[1] = 6