如何使用正则表达式在第一个破折号和下划线分割文本

时间:2019-04-02 16:51:48

标签: regex vba

我将以下内容作为单独的输入:

MCMASTER - 94510A260_M8 EXPAND INSERT FOR PLASTICS
MISUMI-AIPOK6-20
MISUMI - AIPOK6-20
J-5858-01_MISUMI-AIPOK6-20
J-5858-01_MISUMI - AIPOK6-20
J-XXXX_MISUMI-AIPOK6-20
J-5858_MISUMI - AIPOK6-20

我需要分割每行以获得供应商,零件号和描述。

我正在使用:

(J-\d{4}-\d{2}\D{0,1}_|J-XXXX-\d{2}\D{0,1}_|J-\d{4}_){0,1}(.*?)-(.*)_{0,1}(.*)

作为模式,但是它不适用于输入的第一行(以MCMASTER开头。)它适用于所有其余输入。

我希望在第一次输入时会得到如下信息:

Group#1 "Undefined"
Group#2 MCMASTER
Group#3 94510A260
Group#4 M8 EXPAND INSERT FOR PLASTICS

1 个答案:

答案 0 :(得分:0)

您应该可以使用:

(J-(?:\d{4}|XXXX)\D?(?:-\d{2})?_)?(.*?)-([^_\n\r]*)_?(.*)

参见此处:https://regex101.com/r/yljBDA/1

我用较短的{0,1}替换了您的所有?,并且还使用了一些非捕获组来使您的第一个捕获组更加紧凑。

我可以在文本(.*)_{0,1}(.*)上告诉您94510A260_M8 EXPAND INSERT FOR PLASTICS不会达到预期的效果,因为.*很贪婪;也就是说,它会捕获尽可能多的东西。我的最初目的是使第一个捕获对象与.*?保持非贪婪关系,但是由于某种原因,该方法不起作用。因此,我只是使用否定字符类[^_\n\r]*来伪造它。如果您正在逐行处理此输入,则应该可以将其缩短为[^_]