捕获字符串文字可选地正则表达式

时间:2016-11-12 04:49:36

标签: regex

我期望从中获得的输出是

  1. SE 180,个人研究,2016年8月24日,12/12/16,R MAK
  2. SE 180,个人研究,08/24 / 16,12 / 12/16,H KATIRCIOGLU
  3. 然而,正如您所看到的,有时由于数据文件的转换方式,前两个数据字段之间会出现意外的(button)

    这是我想出的正则表达式。我不明白为什么它没有捕获。我跳了一双眼睛会帮助我理解我的错误。我仍然是正则表达式的新手,但这是我理解的

    在我的情况下,为了捕获字符串文字"(按钮)",我输入\(button\)。对于我的数据,字符串文字总是以空格结尾。我想让整组数据可选。因此,我最终得到了(?:\(button\)\s?)?

    使用正则表达式

    https://regex101.com/r/88VDYN/1

    ([A-Z]+\s\S+)\s(?:\(button\)\s?)?([A-Z]+.+?)\s\d+\s\d+.+?(\d\d\/\d\d\/\d\d)-(\d\d\/\d\d\/\d\d)\s?(?:.*?([A-Z]\s[A-Z]+-*[A-Z]+))?\s
    

    数据集

    SE 180 INDIVIDUAL STUDIES 92 49321 3 SUP 73 P 1/90 F 0730-1020 08/24/16-12/12/16 ENG 189 R MAK 
    SE 180 
    (button) 
    INDIVIDUAL STUDIES 90 49320 3 SUP 73 P 0/50 MW 1500-1615 08/24/16-12/12/16 ENG 337 H KATIRCIOGLU 
    

2 个答案:

答案 0 :(得分:3)

您的测试字符串在(button)之前和之后实际上有多个空白字符。一个是换行符,另一个是普通空格。

您需要在\s+周围使用\s*\s而非(button)

([A-Z]+\s\S+)\s+(?:\(button\)\s*)?([A-Z]+.+?)\s\d+\s\d+.+?(\d\d\/\d\d\/\d\d)-(\d\d\/\d\d\/\d\d)\s?(?:.*?([A-Z]\s[A-Z]+-*[A-Z]+))?\s
               ^               ^

Regex101 Demo

答案 1 :(得分:-2)

删除模式中的?:。这就是打破它的原因。

  

([A-Z]+\s\S+)\s(\(button\)\s?)?([A-Z]+.+?)\s\d+\s\d+.+?(\d\d\/\d\d\/\d\d)-(\d\d\/\d\d\/\d\d)\s?(?:.*?([A-Z]\s[A-Z]+-*[A-Z]+))?\s