Go中的正则表达式跨越多行

时间:2019-01-08 15:48:18

标签: regex go

在Go中是否可以使用多行中断复杂的正则表达式?创建更具可读性的代码会很有帮助。

例如在Scala,Ruby,JavaScript中,可以使用x标志:

x — Free-spacing and line comments (aka extended mode)

它允许编写正则表达式,例如:

  TAXON_CONCEPTS2 = /\s+
                     (\(?s\.\s?s\.|
                     \(?s\.\s?l\.|
                     \(?s\.\s?str\.|
                     \(?s\.\s?lat\.|
                    sec\.|sec|near)\b.*$/x

我想在Go中实现类似的代码,而不是:

var taxonConceptsRe2 = regexp.MustCompile(`(,\s*|\s+)(\(?s\.\s?s\.|\(?s\.\s?l\.|\(?s\.\s?str\.|\(?s\.\s?lat\.).*$`)

2 个答案:

答案 0 :(得分:2)

使用+布局看起来略好一些,至少可以拆分正则表达式

var taxonConceptsRe2 = regexp.MustCompile(
    `(,\s*|\s+)(\(?s\.\s?s\.|` +
        `\(?s\.\s?l\.|` +
        `\(?s\.\s?str\.|` +
        `\(?s\.\s?lat\.).*$`)

答案 1 :(得分:2)

您可以通过多种方法来提高正则表达式的可读性。

  1. 分割字符串:

    pattern := `(,\s*|\s+)` +
        `(\(?s\.\s?s\.|` +
        `\(?s\.\s?l\.|` +
        `\(?s\.\s?str\.|` +
        `\(?s\.\s?lat\.).*$`
    
  2. 预解析字符串:

    pattern := strings.Replace(`\s+
                     (\(?s\.\s?s\.|
                     \(?s\.\s?l\.|
                     \(?s\.\s?str\.|
                     \(?s\.\s?lat\.|
                    sec\.|sec|near)\b.*$`,
            "\n                ", "", -1)
    

    如果选择这种方法,则可能需要构建一个函数来为您执行此操作,并且要更加健壮。

  3. 不要使用正则表达式。 (显然,它并不总是理想的,但是正则表达式经常被过度使用,因此请在合理的情况下使用它。)