用正则表达式提取重复模式

时间:2016-06-24 14:42:58

标签: c# regex

我有一些文本,其中写有(id(以Pnumber形式),短划线和名称)的列表。 喜欢在:

P1 - code23
P2 - name asd, P3 -name3
P3 - 837/55 P5 - code/55

如你所见,情侣PX - 名字可以用\ n,逗号或简单空格分隔。

使用正则表达式

(((?<id>P\d)(\s)?-(\s)?(?<name>(.)*)(,)?(\n)?))   

我可以提取在不同行上重复的匹配名称组,但不能提取除以或空格的名称组。 从上面的文字中提取的名字是

code23 (right)
name asd, P3 -name3 (wrong)
837/55 P5 - code/55 (wrong)

如何修改模式?

1 个答案:

答案 0 :(得分:1)

您可以尝试

(?<id>P\d+)\s*-\s*(?<name>.*?)(?=$|,?\s*P\d)

请参阅演示中添加的regex demo\r?,因为多行模式已启用且输入为多行,如果字符串是单独处理的,则不需要\r?和多行模式)。

解释

  • (?<id>P\d+) - 群组ID,P + 1+位数
  • \s*-\s* - 0+个空格,-和0 +空格
  • (?<name>.*?) - 群组名称,除第一个以外的换行符以外的0个字符
  • (?=$|,?\s*P\d) - 字符串结尾(是的,唯一的)或可选的逗号,0 +空格,P和数字。

结果:

enter image description here