Go 中跨多行的正则表达式

dim*_*mus 0 regex go

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

\n\n

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

\n\n

x \xe2\x80\x94 Free-spacing and line comments (aka extended mode)

\n\n

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

\n\n
  TAXON_CONCEPTS2 = /\\s+\n                     (\\(?s\\.\\s?s\\.|\n                     \\(?s\\.\\s?l\\.|\n                     \\(?s\\.\\s?str\\.|\n                     \\(?s\\.\\s?lat\\.|\n                    sec\\.|sec|near)\\b.*$/x\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
var taxonConceptsRe2 = regexp.MustCompile(`(,\\s*|\\s+)(\\(?s\\.\\s?s\\.|\\(?s\\.\\s?l\\.|\\(?s\\.\\s?str\\.|\\(?s\\.\\s?lat\\.).*$`)\n
Run Code Online (Sandbox Code Playgroud)\n

Fli*_*mzy 5

您有几个选项可以提高像这样的正则表达式的可读性。

  1. 分割字符串:

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

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

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

  3. 不要使用正则表达式。(显然并不总是理想的,但正则表达式经常被过度使用,所以如果有意义的话就这样做。)