题目
略,因为太长了!
分析主要思路要对,不会Java的就看看分析
字符串处理的题目,但是感觉思路不对的话处理起来很棘手。以下是我考完后才想出来的思路:
题目定义的规则有:“区块”和“行内”
对于输入的字符串我们的方法是:输入一行处理一行,在整个区块输入结束或整个输入结束后才输出一个区块的转换结果。
第一步:先处理行内,行内包括“强调”和“超级链接”,按照题目中的规则转换强调和超级链接。
第二步:处理区块,区块一共三种:“#”开头的标题、“*”开头的无序列表、其余的就是段落了。一个区块可能有多行,所以在每次处理一行时都要判断此行是否是区块的第一行,方便添加不同的格式
输出:空行和输入结束标志着区块的结束,可以输出结果了,在区块结束或整个输入结束才输出整个区块。代码中用preline保存每一个区块的前面的输入,每次处理一行时都根据preline来判断这个区块的类型,方便输出对应的格式字符串。如: 若preline包含"<ul>",
说明是个无序列表,输出时在最后补上"\n"+"</ul>"
具体实现见代码和注释,大概思路就是这样,C++的字符串感觉处理很麻烦我就写Java的了。。。。
代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String line = null;
String preline = null;
String text = "";
int start,end;
while(sc.hasNextLine()){
line = sc.nextLine();
if(line == null || line.length() == 0){
if(preline == null){//连续空行,跳过
continue;
}
//遇到空行,说明区块结束了,可以输出区块的转换结果了
if(preline.contains("<h")){
System.out.print(preline);
}else if(preline.contains("<ul>")){
preline += "\n"+"</ul>"+"\n";
System.out.print(preline);
}else if(preline.contains("<p>")){
preline += "</p>"+"\n";
System.out.print(preline);
}
//每次输出一个区块都要讲前面的preline置为null
preline = null;
continue;
}
//强调
while((start = line.indexOf("_")) != -1){
end = line.indexOf("_",start+1);
text = line.substring(start, end+1);
line = line.replace(text,"<em>"+text.substring(1,text.length()-1)+"</em>");
}
//超链接
while((start = line.indexOf("[")) != -1){
end = line.indexOf("]",start+1);
text = line.substring(start+1, end);
int khstart = line.indexOf("(",end);
int khend = line.indexOf(")",khstart);
String link = line.substring(khstart+1,khend);
line = line.replace("["+text+"]"+"("+link+")","<a href=\""+link+"\""+">"+text+"</a>");
}
//处理区块
//标题
int num = 0;
if(line.startsWith("#")){
while(line.startsWith("#") && num <=6){
line = line.substring(1);
num++;
}
//忽略标题前的空格
while(line.startsWith(" ")){
line = line.replaceFirst(" ","");
}
preline = "<h"+num+">"+line+"</h"+num+">"+"\n";
//无序列表
}else if(line.startsWith("*")){
//消除星号
line = line.replace("*", "");
//消除星号后面的一个或多个空格
while(line.startsWith(" ")){
line = line.substring(1);
}
if(preline == null){
preline = "<ul>"+"\n"+"<li>"+line+"</li>";
}else{
preline += "\n"+"<li>"+line+"</li>";
}
}else{//段落
if(preline == null){
preline = "<p>"+line;
}else{
preline += "\n"+line;
}
}
}
//输入结束后还要输出最后一个区块的转换结果
if(preline.contains("<h")){
System.out.print(preline);
}else if(preline.contains("<ul>")){
preline += "\n"+"</ul>"+"\n";
System.out.print(preline);
}else if(preline.contains("<p>")){
preline += "</p>"+"\n";
System.out.print(preline);
}
}
}
PS:Java字符串的repaceFirst和replaceAll可以基于规则表达式去替换字符串,尽量直接用replace去做单纯的字符串替换。
字符串执行replace函数后,字符串本身不会发生变化,和substring()函数类似。