在正则表达式中如何用“。”分割并匹配第一组数字?
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
分成 FNBR
和 6
,之后一切都像正常一样使用 .
拆分
我没有使用像 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
我很少使用正则表达式,只有当它出现在项目中时。我试图学习,但我被困住了。任何帮助将不胜感激!
预期行为
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
分成 FNBR
和 6
,之后一切都像正常一样使用 .
我没有使用像 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