正确使用正则表达式

时间:2017-08-25 02:37:24

标签: regex

我想分组以下文字:

---------------------------------------------------------------------------------------
1111.........................................................................US$ 124,85   
1111........AAAAAAAAAAAAAAAAAAAAAAAAAAAAA....................................US$ 124,85
11111.......CCC.CCC..........................................................US$ 140,07
11111.......DDDDDDDDDD.......................................................US$ 157,33
---------------------------------------------------------------------------------------

我正在使用这种模式(fiddle

/(\d{4,6})(\.\.+)(.+)(\.\.+)(US\$\s)(\d+)\,(\d{2})/g

它几乎正在做我想要的,但产品的名称(第3组)最后是点(点应该在第4组中)。我知道Regex有最长的规则,但即使尝试了很多我无法实现的事情。

编辑:

我忘了提到名字可能是一个空字符串,是什么促使我决定使用(\。\。+)而不是(\。+) - 来获得一个点作为名称。对不起。

3 个答案:

答案 0 :(得分:2)

您可以更新正则表达式,以便产品名称中的最后一个匹配项不是句点 - [^.]。这将使捕获结束于最后一个非期间字符,同时仍然捕获产品名称中间的句点,例如CCC.CCC示例产品名称。

如果您没有提及单个.作为产品名称,则可以使用或将单个点或多个字符捕获为(.|.+[^.])

/(\d{4,6})(\.+)(.|.+[^.])(\.+)(US\$\s)(\d+)\,(\d{2})/g

https://regex101.com/r/qnn5N8/3

如果产品名称为空,您可以使用@ (|.+[^.])在下面的评论中提到的/(\d{4,6})(\.+)(|.+[^.])(\.+)(US\$\s)(\d+)\,(\d{2})/g来捕获产品名称的空字符串:

\.\.+

https://regex101.com/r/qnn5N8/4

此示例还通过删除产品名称两侧的额外句点{{1}}来清除正则表达式,如下所示。这是有效的,因为第一场比赛是贪婪的,并且将匹配一段时间的所有内容,而第二场比赛被非句号字符包围。

答案 1 :(得分:1)

查看regex101

正则表达式

(?<nr>\d{4,6})(?:\.+)(?<product>(.*[^.]|))(?:\.+)US\$\s(?<dollars>\d+),(?<cents>\d{2})

表明productname可以包含'。'。在名称的某个地方。

答案 2 :(得分:1)

有很多方法可以做你要求的,这就是我会用的:

(\d{4,6})\.{2,}([^.]+(?:\.[^.]+)*)?\.{2,}US\$\s(\d+\,\d{2})

每行将有3次捕获:产品ID,产品描述和价格。