我正在解析库存清单上的一堆订单项,而每行都描述类似的内容,但文本格式并未标准化。我过去几天一直在研究正则表达式模式但是我没有太多运气来获得一个可以匹配我所有测试场景的模式。我希望有更多正则表达式经验的人可能能够在模式中指出一些错误
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,但它太贪婪并且包含前面提到的批次单词
答案 0 :(得分:2)
括号中的任何内容都会导致引擎查找其中一个提供的字符。您的模式成功匹配,例如,字符串:Palette Nabcdefg
要指明其中一个不同的选项,您需要使用paranthesis。您实际需要的内容应该是这样的:[Pp]alette (No\.?\s?|#)?(\d+?)
虽然没有标准化模式似乎非常无效。例如,你的最后一个案例可能完全不兼容,因为它似乎能够包含任何类型的输入。
答案 1 :(得分:1)
关于将模式与正则表达式匹配的一些解释。在这种情况下,您真的不需要查找和匹配括号( .. )
。
假设我们想要找到任何带有 Palette 的字符串,后面跟着空格和#
符号,并从中捕获Palette序列。
您只需使用以下内容:
[Pp]alette\s+#([A-Z0-9]+)
这将导致从匹配的模式中捕获91L41
和1
1. Warehouse A, (Palette #91L41)
4. Store Location D of Palette (Palette #1)
现在说我们要找到任何包含 Palette 的字符串,后跟空格和#
符号或No.
我们可以使用Non-capturing group。非捕获括号将正则表达式分组,因此您可以应用正则表达式运算符,但不捕获任何内容。
所以我们可以这样做:
[Pp]alette\s+(?: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)
最后如果你想匹配以下所有字符串并捕获Palette序列。
[Pp]alette[\w, ]+(?:No[ .]+|#)([A-Z0-9]+)
在此正则表达式上查看working demo和explanation。
每个人都有不同的使用正则表达式的方式,这只是您可以简单理解并完成此任务的众多方法之一。
答案 2 :(得分:1)
这适用于您的情况:
[Pp]alette.*?(?:No\.?|#)\s*(\w+)
这将搜索以下类型的模式:
检查行动here
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`