Golang正则表达式替换不包括带引号的字符串

Qian Chen

我正在尝试removeComments通过此Javascript实现在Golang中实现该功能我希望从文本中删除任何评论。例如:

/* this is comments, and should be removed */

However, "/* this is quoted, so it should not be removed*/"

在Javascript实现中,带引号的匹配项不会按组捕获,因此我可以轻松地将它们过滤掉。但是,在Golang中,分辨匹配的部分是否被捕获似乎并不容易。那么如何removeComments在Golang中实现与Javascript版本相同的逻辑?

用户名

这些不保留格式


首选方式(如果第1组不匹配,则产生NULL)
在golang游乐场中工作-

     # https://play.golang.org/p/yKtPk5QCQV
     # fmt.Println(reg.ReplaceAllString(txt, "$1"))
     # (?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//[^\n]*(?:\n|$))|("[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|[\S\s][^/"'\\]*)

     (?:                              # Comments 
          /\*                              # Start /* .. */ comment
          [^*]* \*+
          (?: [^/*] [^*]* \*+ )*
          /                                # End /* .. */ comment
       |  
          //  [^\n]*                       # Start // comment
          (?: \n | $ )                     # End // comment
     )
  |  
     (                                # (1 start), Non - comments 
          "
          [^"\\]*                          # Double quoted text
          (?: \\ [\S\s] [^"\\]* )*
          "
       |  
          '
          [^'\\]*                          # Single quoted text
          (?: \\ [\S\s] [^'\\]* )*
          ' 
       |  [\S\s]                           # Any other char
          [^/"'\\]*                        # Chars which doesn't start a comment, string, escape, or line continuation (escape + newline)
     )                                # (1 end)

另一种方式(组1始终匹配,但可以为空)
在golang游乐场中工作-

 # https://play.golang.org/p/7FDGZSmMtP
 # fmt.Println(reg.ReplaceAllString(txt, "$1"))
 # (?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//[^\n]*(?:\n|$))?((?:"[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|[\S\s][^/"'\\]*)?)     

 (?:                              # Comments 
      /\*                              # Start /* .. */ comment
      [^*]* \*+
      (?: [^/*] [^*]* \*+ )*
      /                                # End /* .. */ comment
   |  
      //  [^\n]*                       # Start // comment
      (?: \n | $ )                     # End // comment
 )?
 (                                # (1 start), Non - comments 
      (?:
           "
           [^"\\]*                          # Double quoted text
           (?: \\ [\S\s] [^"\\]* )*
           "
        |  
           '
           [^'\\]*                          # Single quoted text
           (?: \\ [\S\s] [^'\\]* )*
           ' 
        |  [\S\s]                           # Any other char
           [^/"'\\]*                        # Chars which doesn't start a comment, string, escape, or line continuation (escape + newline)
      )?
 )                                # (1 end)

Cadilac-保留格式

(不幸的是,这在Golang中无法完成,因为Golang无法执行断言)

     # raw:   ((?:(?:^[ \t]*)?(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|/\*|//)))?|//(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|/\*|//))|(?=\r?\n))))+)|("[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|(?:\r?\n|[\S\s])[^/"'\\\s]*)
     # delimited:  /((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|("[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|(?:\r?\n|[\S\s])[^\/"'\\\s]*)/

     (                                # (1 start), Comments 
          (?:
               (?: ^ [ \t]* )?                  # <- To preserve formatting
               (?:
                    /\*                              # Start /* .. */ comment
                    [^*]* \*+
                    (?: [^/*] [^*]* \*+ )*
                    /                                # End /* .. */ comment
                    (?:                              # <- To preserve formatting 
                         [ \t]* \r? \n                                      
                         (?=
                              [ \t]*                  
                              (?: \r? \n | /\* | // )
                         )
                    )?
                 |  
                    //                               # Start // comment
                    (?:                              # Possible line-continuation
                         [^\\] 
                      |  \\ 
                         (?: \r? \n )?
                    )*?
                    (?:                              # End // comment
                         \r? \n                               
                         (?=                              # <- To preserve formatting
                              [ \t]*                          
                              (?: \r? \n | /\* | // )
                         )
                      |  (?= \r? \n )
                    )
               )
          )+                               # Grab multiple comment blocks if need be
     )                                # (1 end)

  |                                 ## OR

     (                                # (2 start), Non - comments 
          "
          [^"\\]*                          # Double quoted text
          (?: \\ [\S\s] [^"\\]* )*
          "
       |  
          '
          [^'\\]*                          # Single quoted text
          (?: \\ [\S\s] [^'\\]* )*
          ' 
       |  
          (?: \r? \n | [\S\s] )            # Linebreak or Any other char
          [^/"'\\\s]*                      # Chars which doesn't start a comment, string, escape,
                                           # or line continuation (escape + newline)
     )                                # (2 end)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式不包括字符串

来自分类Dev

正则表达式用_(Sublime)替换带引号的字符串中的空格

来自分类Dev

正则表达式替换所有字符串,不包括特殊前缀

来自分类Dev

正则表达式检索带引号的字符串和引号字符

来自分类Dev

正则表达式可以匹配任何带引号的字符串或特定的不带引号的字符串

来自分类Dev

正则表达式处理带引号的字符串和双引号英寸

来自分类Dev

Python正则表达式将带引号的字符串与转义的单引号匹配

来自分类Dev

javascript正则表达式选择带引号的字符串,但不转义引号

来自分类Dev

使用正则表达式捕获不带引号的双引号内的字符串

来自分类Dev

正则表达式匹配忽略双引号的带引号的字符串

来自分类Dev

使用正则表达式解析SQL,但不包括带引号的文字

来自分类Dev

正则表达式查找带引号的字符串中的所有大括号

来自分类Dev

正则表达式以匹配变量或字符串的值(带或不带引号)

来自分类Dev

正则表达式查找带引号的字母的字符串

来自分类Dev

正则表达式查找带引号的字符串中的所有大括号

来自分类Dev

无法在ruby中使用正则表达式突出显示带引号的字符串

来自分类Dev

PHP 正则表达式提取带引号和括号的子字符串

来自分类Dev

凌乱的字符串。到底正则表达式不包括“@”字符

来自分类Dev

正则表达式匹配字符串开头但不包括

来自分类Dev

正则表达式匹配字符串开头但不包括

来自分类Dev

编程:使用正则表达式提取字符串(不包括空格)

来自分类Dev

正则表达式匹配大于长度的字符串,但不包括末尾的匹配

来自分类Dev

javascript字符串正则表达式替换引号之间的字符串

来自分类Dev

正则表达式提取逗号之间的字符串,但包括引号

来自分类Dev

正则表达式不包括在引号中

来自分类Dev

正则表达式使用不带引号的键/值对中的空格分割字符串

来自分类Dev

正则表达式用引号替换字符串

来自分类Dev

正则表达式->替换最多但不包括

来自分类Dev

正则表达式匹配不包括第一个字符的字符串

Related 相关文章

  1. 1

    正则表达式不包括字符串

  2. 2

    正则表达式用_(Sublime)替换带引号的字符串中的空格

  3. 3

    正则表达式替换所有字符串,不包括特殊前缀

  4. 4

    正则表达式检索带引号的字符串和引号字符

  5. 5

    正则表达式可以匹配任何带引号的字符串或特定的不带引号的字符串

  6. 6

    正则表达式处理带引号的字符串和双引号英寸

  7. 7

    Python正则表达式将带引号的字符串与转义的单引号匹配

  8. 8

    javascript正则表达式选择带引号的字符串,但不转义引号

  9. 9

    使用正则表达式捕获不带引号的双引号内的字符串

  10. 10

    正则表达式匹配忽略双引号的带引号的字符串

  11. 11

    使用正则表达式解析SQL,但不包括带引号的文字

  12. 12

    正则表达式查找带引号的字符串中的所有大括号

  13. 13

    正则表达式以匹配变量或字符串的值(带或不带引号)

  14. 14

    正则表达式查找带引号的字母的字符串

  15. 15

    正则表达式查找带引号的字符串中的所有大括号

  16. 16

    无法在ruby中使用正则表达式突出显示带引号的字符串

  17. 17

    PHP 正则表达式提取带引号和括号的子字符串

  18. 18

    凌乱的字符串。到底正则表达式不包括“@”字符

  19. 19

    正则表达式匹配字符串开头但不包括

  20. 20

    正则表达式匹配字符串开头但不包括

  21. 21

    编程:使用正则表达式提取字符串(不包括空格)

  22. 22

    正则表达式匹配大于长度的字符串,但不包括末尾的匹配

  23. 23

    javascript字符串正则表达式替换引号之间的字符串

  24. 24

    正则表达式提取逗号之间的字符串,但包括引号

  25. 25

    正则表达式不包括在引号中

  26. 26

    正则表达式使用不带引号的键/值对中的空格分割字符串

  27. 27

    正则表达式用引号替换字符串

  28. 28

    正则表达式->替换最多但不包括

  29. 29

    正则表达式匹配不包括第一个字符的字符串

热门标签

归档