完整的正则表达式模式 - 字符串排除、可选结束括号、多个匹配项



我正在解析库存列表中的一堆行项目,虽然每行都描述了类似的东西,但文本格式没有标准化。在过去的几天里,我一直在研究正则表达式模式,但我没有太多运气获得可以匹配我所有测试场景的模式。我希望具有更多正则表达式经验的人能够指出模式中的一些错误

Pattern To Match the palette number: ([Pp]alette [No.s]?#?(.*?)),
1. Warehouse A, (Palette #91L41)
# Match Result Correct: 91L41
2. Warehouse B Palette No. 214
# Match Result Incorrect: no match
3. Warehouse Lot Storage C (Palette No. 9),
# Match Result Incorrect: o. 9 //I don't quite understand why it matches the o
4. Store Location D of Palette (Palette #1),
# Match Result Correct: 1
5. Store Location E of Palette, Empty, lot #45, 
# Match Result Incorrect: no match

我还尝试使括号可选,以便它与示例 2 和 5 匹配,但它太贪婪了,并且包含前面提到的批词

括号

中的任何内容都会导致引擎查找提供的字符之一。例如,您的模式成功匹配如下字符串:Palette Nabcdefg

要指示不同的选项之一,您需要使用偏执。您实际要查找的内容应如下所示:[Pp]alette (No.?s?|#)?(d+?)

尽管不标准化模式似乎非常无效。例如,您的最后一个情况可能完全不兼容,因为它似乎能够包含任何类型的输入。

关于将模式与正则表达式匹配的一些解释。在这种情况下,您真的不需要查找和匹配( .. )括号。

假设我们只想找到任何带有单词 Palette 的字符串,后跟空格和#符号,并从中捕获 Palette 序列。

您可以简单地使用以下方法:

[Pp]alettes+#([A-Z0-9]+)

这将导致从匹配的模式中捕获91L411

1. Warehouse A, (Palette #91L41)
4. Store Location D of Palette (Palette #1)

现在假设我们要查找任何具有调色板的字符串,后跟空格和#符号或No.

为此,我们可以使用非捕获组。非捕获括号对正则表达式进行分组,以便您可以应用正则表达式运算符,但不捕获任何内容。

因此,我们可以执行以下操作:

[Pp]alettes+(?:No[ .]+|#)([A-Z0-9]+)

现在,这将匹配以下字符串并捕获91L4121491

1. Warehouse A, (Palette #91L41)
2. Warehouse B Palette No. 214
3. Warehouse Lot Storage C (Palette No. 9)
4. Store Location D of Palette (Palette #1)

最后,如果要匹配以下所有字符串并捕获调色板序列。

[Pp]alette[w, ]+(?:No[ .]+|#)([A-Z0-9]+)

请参阅工作演示和有关此正则表达式的说明。

每个人都有不同的使用正则表达式的方式,这只是您可以简单地理解和完成此操作的众多方法之一。

这应该适用于您的情况:

[Pp]alette.*?(?:No.?|#)s*(w+)

这将搜索以下类型的模式:

  • [Pp]alette{any_characters}No.{optonal_spaces}(字母数字(
  • [Pp]alette{any_characters}No{optonal_spaces}(alphanumeric(
  • [Pp]alette{any_characters}#{optonal_spaces}(alphanumeric(

在此处检查其运行情况

MATCH 1
1.  [26-31]    `91L41`
MATCH 2
1.  [60-63]    `214`
MATCH 3
1.  [104-105]    `9`
MATCH 4
1.  [148-149]    `1`
MATCH 5
1.  [195-197]    `45`

最新更新