2017-08-25 74 views
2

我想下面的文本群体分裂的权利:获得最正则表达式

--------------------------------------------------------------------------------------- 
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中)。我知道正则表达式有最长的规则,但即使尝试了很多我无法实现的规则。

编辑:

我忘了提及这个名字可能是一个空字符串,是什么驱使使用我的决定(。\ \ +)而不是(\ +) - 获得一个点作为名称。对于那个很抱歉。

+0

您需要阅读产品名称,直到遇到点。所以[^。] +对于组3来说是最好的。更正:你的产品名称可能有'。'。让我以正确的答案回答。 –

+0

针对组3的'[^。] +'不会正确捕获第2行的产品名称:'CCC.CCC' – Grokify

+0

已更新我的答案,以查找空的产品名称。 – Grokify

回答

2

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

为了得到一个.作为产品名称时没有出现你提到,你可以使用一个或捕捉到一个点或多个字符为(.|.+[^.])

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

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

如下面的注释中提到的@mlambrichs,您也可以通过使用(|.+[^.])来捕获产品名称为空的空字符串:

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

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

这个例子还通过在产品名称像下面两侧去除多余的周期\.\.+有点清理正则表达式。这是有效的,因为第一场比赛是贪婪的,并且会匹配一段时间内的所有内容,而第二场比赛被非周期字符包围。

+0

你的回答非常好。我只是忘了包括名字为空的情况。对于那个很抱歉。 – Nizam

+0

不用担心。上面已经添加了空产品名称大小写,并在更新后的regex101链接中添加了。 – Grokify

+0

太好了。非常感谢。我只是不能考虑正则表达式。 – Nizam

1

regex101

正则表达式

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

显示,产品名称可以包含一个 ''。在名字的某处。

+0

好的。更新问题:产品名称可以为空。去适应我的答案。 –

+0

我只是忘记包含名称为空的情况。对于那个很抱歉。 – Nizam

+0

调整。 ([A-Z] + \。?[A-Z] + |)更准确,因为它匹配产品名称可能带有'。'。中间某处或产品名称为空。 –

1

这样做有什么你问的许多方面,这是我会用:

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

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

+0

我很尴尬,但我忘记包括一个非常重要的问题,我可以拥有的例子。对于那个很抱歉。 – Nizam

+0

然后,只需在产品名称捕获组后添加一个'?'。 –