0

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

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 匹配,但它太贪婪并包含前面提到的 lot 词

4

3 回答 3

2

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

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

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

于 2013-09-29T20:05:36.827 回答
1

这应该适用于您的情况:

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

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

  • [Pp]alette {any_characters}编号{optonal_spaces}(字母数字
  • [Pp]alette {any_characters}{optonal_spaces}(字母数字
  • [Pp]alette {any_characters} # {optonal_spaces}(字母数字

在此处查看实际情况

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`
于 2013-09-29T22:04:15.600 回答
1

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

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

您可以简单地使用以下内容:

[Pp]alette\s+#([A-Z0-9]+)

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

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

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

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

所以我们可以这样做:

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

现在这导致匹配以下字符串并捕获91L41, 214,91

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]+)

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

每个人都有不同的使用正则表达式的方式,这只是您可以简单地理解和实现这一点的众多方式之一。

于 2013-09-29T21:46:02.803 回答