My RegEx Library

2017-09-19  本文已影响0人  mxl0814

5. 删除程序中的各种注释


匹配注释的表达式

匹配字符串的表达式

所以整个表达式可以写成


表达式的顺序是不重要的,但是文本中那种内容更多可能改变表达式的顺序却可以提高效率
如果要删除注释,则替换的时候替换成字符串匹配到的内容即可,如果注释匹配为空,则无影响,如果字符串为空,则注释将被删除

regex: ((["'])(?:(?!\2)[^\n\\])*+(?:\\.(?:(?!\2)[^\n\\])*+)*+\2)|/\*[\s\S]*?\*/|//.*+
replacement: $1


不使用忽略优先量词和环视来匹配注释的更高效版本

因为在java中测试,匹配多行注释使用这种办法效率更高,而匹配单引号和双引号不使用多选分支效率更高


进一步优化

([^/'"]++|(["'])(?:(?!\2)[^\n\\])*+(?:\\.(?:(?!\2)[^\n\\])*+)*+\2)|/\*[^*]*+(?:\*++[^/*][^*]*+)*+\*++/|//.*+

String test = "test"/*middle comments*/;

所以我们应该使用星号量词: [^'/"]*
得到最后的表达式
([^/'"]++|(["'])(?:(?!\2)[^\n\\])*+(?:\\.(?:(?!\2)[^\n\\])*+)*+\2[^/'"]*+)|/\*[^*]*+(?:\*++[^/*][^*]*+)*+\*++/|//.*+


可能还会考虑到优化

  1. normal: [^/'"]
  2. special: (?:((["'])(?:(?!\2)[^\n\\])*+(?:\\.(?:(?!\2)[^\n\\])*+)*+\2)|(?:/\*[^*]*+(?:\*++[^/*][^*]*+)*+\*++/|//.*+))

但实际上这是不正确的$2$4捕获的文本存在于量词限定之中,其捕获的文本时刻在发生改变,每次都为最后一次应用匹配到的文本。

4. 匹配程序中的字符串

  1. 匹配双引号字符串: "(?:[^\\"\n]|\\.)*+"
  2. 匹配单引号字符串: '(?:[^\\'\n]|\\.)*+'
  1. "[^\\"\n]*+(?:\\.[^\\"\n]*+)*+"
  2. '[^\\'\n]*+(?:\\.[^\\'\n]*+)*+'

3. 单纯匹配程序多行注释

special部分匹配的内容是normal不能匹配的疑似结束tag的内容,但是special又不会匹配掉结束tag,所以这里可以把诺干个****...[^/*]当作special,****.../当作结束tag,之所以不能把*[^/]当作special,*/当作结束tag,是因为如果结束是**/,这样的字符,会造成special匹配**/被normal部分匹配掉.

不使用忽略优先量词与环视


regex3: /\*(?:(?!\*/)[\s\S])*+\*/
regex4: /\*[\s\S]*?\*/

2. 匹配CVS文件的内容


regex1: (?:(?<=,)|^)(?:[^\n,]*+|"(?:[^\n"]|"")*+")
regex2: (?:(?<=,)|^)(?:[^\n,]*+|"[^\n"]*+(?:""[^\n"]*+)*+")

1. 为数值添加逗号

问题:

解决办法:

  1. 前面要存在数字——使用(?<=\d)
  2. 后面要存在数字且是3的整倍数——(?=(?:\d\d\d)+$)

regex: (?<=\d)(?=(?:\d{3})++$)
replacement: ,

上一篇下一篇

猜你喜欢

热点阅读