Regex 在正则表达式中获得最正确的结果

Regex 在正则表达式中获得最正确的结果,regex,Regex,我想将以下文本分成几组: --------------------------------------------------------------------------------------- 1111.........................................................................US$ 124,85 1111........AAAAAAAAAAAAAAAAAAAAAAAAAAAAA.................

我想将以下文本分成几组:

---------------------------------------------------------------------------------------
1111.........................................................................US$ 124,85   
1111........AAAAAAAAAAAAAAAAAAAAAAAAAAAAA....................................US$ 124,85
11111.......CCC.CCC..........................................................US$ 140,07
11111.......DDDDDDDDDD.......................................................US$ 157,33
---------------------------------------------------------------------------------------
我正在使用这个模式()

它几乎是在做我想做的事情,但产品名称(第3组)的末尾带有点(点应该在第4组中)。我知道Regex有最长的规则,但即使尝试了很多事情,我也没能做到

编辑:


我忘了提到名称可能是一个空字符串,这促使我决定使用(\.\.+)而不是(\.+)-来获得一个单点作为名称。很抱歉。

您可以更新您的正则表达式,以便产品名称中的最后一个匹配项不是句点-
[^.]
。这将捕获最后一个非周期字符,同时仍然捕获产品名称中间的周期,例如您的代码> CCC。CCC < /COD>示例产品名称。 若要在您提到的产品名称不存在时获取单个
,可以使用或捕获单个点或多个字符作为
(.|.+[^.])

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

当产品名称为空时,您还可以使用@mlambrichs在下面的注释中提到的
(|.+[^.])
为其捕获空字符串:

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

此示例还通过删除产品名称两侧的额外句点
\.\.+
稍微清理了正则表达式,如下所示。这是因为第一个匹配是贪婪的,它将匹配所有句点,而第二个匹配被非句点字符包围。

请看

正则表达式

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

显示productname可以包含“.”。在名字的某个地方。

有很多方法可以满足你的要求,这就是我应该使用的:

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

每行将有3个捕获:产品id、产品描述和价格。

您需要阅读产品名称,直到遇到点为止。所以[^.]+对第三组最好。更正:您的产品名称可能有一个“.”。让我用正确的答案回答这个问题。
[^.]+
对于第3组,将无法正确捕获第2行的产品名称:
CCC.CCC
更新了我的答案,以获得一个空的产品名称。确定。问题更新:productname可以为空。我将修改我的答案。我只是忘了包括名称为空的情况。对不起,我已经调整好了。[[ZZ++.[[ZZ]+] ]更准确,因为它与产品名称匹配,可能在中间某个地方或产品名称为空。如果产品名称是“电源锯5000”或“V8蔬菜汁”@ RoBurtMcKeE足够公平,则失败。让我们将产品名称设置为类似(|。*[^.])。你的回答很好。我只是忘了把姓名为空的情况包括在内。对不起,别担心。上面和更新的regex101 link.Great中添加了空产品名称案例。谢谢。我只是还不能用正则表达式的方式来思考。我以前经常使用O'Reilly的《掌握正则表达式》一书。这是一本很棒的书,也是我反复阅读的少数几本书之一。@Grokify。同意你的书上的陈述。在正则表达式上:为什么不将产品更改为(|。*[^.])?然后,您的产品名称可能真的是空的。在你的正则表达式中,它仍然可以是“.”。我有点尴尬,但我忘了包括一个我可能遇到的问题的非常重要的例子。很抱歉。然后只需在产品名称捕获组后添加一个
(\d{4,6})\.{2,}([^.]+(?:\.[^.]+)*)?\.{2,}US\$\s(\d+\,\d{2})