正则表达式可选匹配

时间:2015-11-02 21:11:26

标签: regex

我有自己做的这个正则表达式模式(虽然我是一个菜鸟,并通过以下教程完成):

^([a-z0-9\p{Greek}].*)\s(Ε[0-9\p{Greek}]+|Θ)\s[\(]([a-z1-9\p{Greek}]+.*)[\)]\s-\s([a-z0-9\p{Greek}]+$)

我正在尝试匹配以下句子:

  

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣΕΦΑΡΜΣΤΟΔΙΔΔΚΤΥΟΕ2(Ε.Β.Δ。) - ΔΗΜΗΤΡΙΟΥ

     

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ1Θ(ΑΜΦ) - ΜΑΣΤΟΡΟΚΩΣΤΑΣ

     

ΕΙΣΑΓΩΓΗΣΤΗΝΠΛΗΡΟΦΟΡΙΚΗΘ(ΑΜΦ) - ΒΟΛΟΓΙΑΝΝΙΔΗΣ

等等。

此模式将字符串分为4个部分。

例如,对于字符串:

  

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣΕΦΑΡΜΣΤΟΔΙΔΔΚΤΥΟΕ2(Ε.Β.Δ。) - ΔΗΜΗΤΡΙΟΥ

第一场比赛是:ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣΕΦΑΡΜΣΤΟΔΙΔΔΚΤΥΟ(主题名称)

第二场比赛是:Ε2(Class)

第三场比赛是:Ε.Β.Δ。 (房间)

第四场比赛是:ΔΗΜΗΤΡΙΟΥ(老师)

<小时/> 现在有些条目E*/Θ未定义,我希望在没有E*/Θ的情况下获得3场比赛。我应该如何修改我的模式,以便(Ε[0-9\p{Greek}]+|Θ)是可选匹配?

到目前为止我尝试了?,但因为在之前的比赛中我定义了\s\s,所以需要2个空格来获得3个匹配,而我的字符串只有一个

2 个答案:

答案 0 :(得分:2)

我认为你需要做两件事:

  • .*懒惰(即.*?
  • (?:\s(Ε[0-9\p{Greek}]+|Θ))?包含在非捕获可选组中。

正则表达式看起来像

^([a-z0-9\p{Greek}].*?)(?:\s(Ε[0-9\p{Greek}]+|Θ))?\s[\(]([a-z1-9\p{Greek}]+.*)[\)]\s-\s([a-z0-9\p{Greek}]+)$
                    ^^  ^^                       ^

请参阅demo

如果你没有使第一个.*懒惰,它会吃掉第二个可选的组。使其变得懒惰将确保如果某些文本可以被第二个捕获组匹配,则它将被设置为#34;。

请注意,您调用捕获组 匹配,这是错误的。匹配是整个正则表达式匹配的整个文本,捕获只是通过未转义的圆括号中包含的正则表达式部分匹配的子字符串。有关capture groups at regular-expressions.info的更多信息,请参阅。

答案 1 :(得分:-2)

您可以使用以下内容:

(E[0-9\p{Greek}]+|0)?

整个小组将是可选的(?)。