package com.jielan.state.comment;
import java.util.ArrayList;
import java.util.List;
public class Main {
private State state;
public List<String> getComments(String input) {
List<String> list = new ArrayList<String>();
int virStart=0, docStart=0, comStart=0;
state = State.READ_SKIP.read(input.charAt(0));
for(int i=1;i<input.length();i++){
state = state.read(input.charAt(i));
if(state.equals(State.DOUBLE_VIRGULE)){
virStart = i-1;
}else if(state.equals(State.DOCUMENT_START)){
docStart = i-2;
}else if(state.equals(State.COMMENT_START)){
comStart = i-1;
}else if(state.equals(State.END_VIRGULE)){
list.add("单行注释:"+input.substring(virStart, i+1));
}else if(state.equals(State.END_DOCUMENT)){
list.add("文档注释:"+input.substring(docStart, i+1));
}else if (state.equals(State.END_COMMENT)) {
list.add("文本注释:"+input.substring(comStart, i+1));
}
}
return list;
}
public static void main(String[] args) {
Main main = new Main();
String input = "/**544*fdsaf\newr/*/**dsfia/*/*/";
List<String> list = main.getComments(input);
for(String var:list){
System.out.println(var);
}
}
}
package com.jielan.state.comment;
public enum State {
//开始浏览
READ_SKIP{
@Override
public State read(Character c) {
switch (c) {
case '/':
return FIND_VIRGULE;
default:
return READ_SKIP;
}
}
},
//发现斜杠
FIND_VIRGULE{
@Override
public State read(Character c) {
switch (c) {
case '/':
return DOUBLE_VIRGULE;
case '*':
return COMMENT_START;
default:
return READ_SKIP;
}
}
},
//发现双斜杠
DOUBLE_VIRGULE{
@Override
public State read(Character c) {
switch (c) {
case '\n':
return END_VIRGULE;
default:
return VIRGULE_CONTINUE;
}
}
},
VIRGULE_CONTINUE{
@Override
public State read(Character c) {
switch (c) {
case '\n':
return END_VIRGULE;
default:
return VIRGULE_CONTINUE;
}
}
},
// '/*' 后继状态处理 (文本注释or文档注释开始)
COMMENT_START{
@Override
public State read(Character c) {
switch (c) {
case '*':
return DOCUMENT_START;
default:
return COMMENT_CONTINUE;
}
}
},
// ‘/*^[*]’ 后继处理
COMMENT_CONTINUE{
@Override
public State read(Character c) {
switch (c) {
case '*':
return COMMENT_FIND;
default:
return COMMENT_CONTINUE;
}
}
},
// // ‘/**’ 后继处理
// SECOND_ASTERISK{
// @Override
// public State read(Character c) {
// switch (c) {
// case '*':
// return DOCUMENT_FIND;
// case '/':
// return END_COMMENT;
// default:
// return DOCUMENT_CONTINUE;
// }
// }
// },
//‘/*(任意)*’后继处理 发现文本注释 结束星号
COMMENT_FIND{
@Override
public State read(Character c) {
switch (c) {
case '/':
return END_COMMENT;
case '*':
return COMMENT_FIND;
default:
return COMMENT_CONTINUE;
}
}
},
//'/**' 后继 文档注释开始
DOCUMENT_START{
@Override
public State read(Character c) {
switch (c) {
case '*':
return DOCUMENT_FIND;
case '/':
return END_COMMENT;
default:
return DOCUMENT_CONTINUE;
}
}
},
// ‘/**(任意)’ 后继 文档注释开始
DOCUMENT_CONTINUE{
@Override
public State read(Character c) {
switch (c) {
case '*':
return DOCUMENT_FIND;
default:
return DOCUMENT_CONTINUE;
}
}
},
// ‘/**(任意)*’后继 发现文档注释的 结束星号
DOCUMENT_FIND{
@Override
public State read(Character c) {
switch (c) {
case '/':
return END_DOCUMENT;
case '*':
return DOCUMENT_FIND;
default:
return DOCUMENT_CONTINUE;
}
}
},
//‘//’形式注释结束
END_VIRGULE{
@Override
public State read(Character c) {
switch (c) {
case '/':
return FIND_VIRGULE;
default:
return READ_SKIP;
}
}
},
//‘/** */’注释结束
END_DOCUMENT{
@Override
public State read(Character c) {
switch (c) {
case '/':
return FIND_VIRGULE;
default:
return READ_SKIP;
}
}
},
// ‘/* */’注释结束
END_COMMENT{
@Override
public State read(Character c) {
switch (c) {
case '/':
return FIND_VIRGULE;
default:
return READ_SKIP;
}
}
};
public abstract State read(Character c);
}