我正在解析库存列表中的一堆行项目,虽然每行都描述了类似的东西,但文本格式没有标准化。在过去的几天里,我一直在研究正则表达式模式,但我没有太多运气获得可以匹配我所有测试场景的模式。我希望具有更多正则表达式经验的人能够指出模式中的一些错误
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]+)
这将导致从匹配的模式中捕获91L41
和1
1. Warehouse A, (Palette #91L41)
4. Store Location D of Palette (Palette #1)
现在假设我们要查找任何具有调色板的字符串,后跟空格和#
符号或No.
为此,我们可以使用非捕获组。非捕获括号对正则表达式进行分组,以便您可以应用正则表达式运算符,但不捕获任何内容。
因此,我们可以执行以下操作:
[Pp]alettes+(?:No[ .]+|#)([A-Z0-9]+)
现在,这将匹配以下字符串并捕获91L41
、214
、9
和1
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`