正则表达式在一行中分隔多个项目

时间:2017-05-05 12:53:40

标签: regex

我有一组结果,我想用Regex解析,我似乎无法找到一个有效的表达式。在txt文件的每一行中,有2个条目,每个条目包含最多100个数量,后跟不同长度和空格的项目名称。

示例:

7 BALLS OF STRING 13 CARDBOARD BOXES
14 ROCKS 12 PENCILS

我想将第一个条目与第1组中的数量相匹配,将第二个条目与第2组中的数量相匹配。

1 个答案:

答案 0 :(得分:0)

您可以使用以下正则表达式模式并在读取文件时使用它,每行一行:

^(\d*\s[A-Z\s]*)\s(\d*\s[A-Z\s]*)$

以下是一个实例:https://regex101.com/r/18dege/1

这里有一些细节:

  • ^匹配字符串的开头,$结尾
  • \d*匹配任意数字(0或更多)的贪婪数字字符(等于[0-9]*
  • \s匹配空格字符(例如标签,空格等)
  • [A-Z\s]*匹配任何数字(0或更多)的大写字符和空白贪婪
  • ()创建一个匹配组(以提取字符串的某些部分)

根据下面的评论,大写字母后面可以跟小写字母,不应该匹配。一个例子是:

7 BALLS OF STRING 13 CARDBOARD BOXES
14 ROCKS 12 PENCILS
18 TABLES 3 BLANKETS sewn with patches

要匹配此模式,您可以使用以下正则表达式:

^(\d*\s[A-Z\s]*?)[a-z\s]*\s(\d*\s[A-Z\s]*?)[a-z\s]*$

作为上述模式的更新,我添加了以下内容:

    语句(不在组中)和第二个语句之后的
  • [a-z\s]*匹配小写字符串
  • (\d*\s[A-Z\s]*?)我添加了问号?,以使匹配非贪婪。这可以防止将大写和小写部分之间的空白添加到匹配组。现在需要在模式的末尾添加字符串结尾$,否则,第二组将不匹配足够的字符。

以下是一个实例:https://regex101.com/r/18dege/2