正则问题

ooo19841080xinxin 2008-10-06 05:58:39
提取一个java文件里除注释外的汉字
给个正则
...全文
447 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiandongbo 2008-10-08
  • 打赏
  • 举报
回复
恩对,一时间犯迷糊了~谢谢啦!
闪起,睡觉~
ooo19841080xinxin 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 bao110908 的回复:]
引用 43 楼 ooo19841080xinxin 的回复:
谢谢火龙大哥了
String s = "2中ss文+" + "2yin\\\"中文\"" + "2中文";
这类的好像还没有解决,昨天想了一下没有想到很好的方案


不会啊,这个能提取出

"2中ss文+"
"2yin\\\"中文\""
"2中文"

啊?

而且你在 27 楼的示例中也是给出的。
[/Quote]
看错了 ,是解决了 ,谢谢了
可以结贴了
llddy 2008-10-08
  • 打赏
  • 举报
回复
火龙 回火星吧~ 地球不适合你
qiandongbo 2008-10-08
  • 打赏
  • 举报
回复
火龙那强人,学什么什么好,前几天我还跟踪他的发言,学JS~
不知道自己什么时候能学成他那样,最近老端正不了心态,哎
qiandongbo 2008-10-08
  • 打赏
  • 举报
回复
我发现一定要在最佳状态下看正则,不然一不小心脑子就犯迷糊~
zapdos 2008-10-08
  • 打赏
  • 举报
回复
火龙哥好像研究正则很久了啊
还有什么看家本领或奇淫技巧也拿出来晒晒吧
也好让我们这些小的膜拜一下...
zapdos 2008-10-08
  • 打赏
  • 举报
回复

//测试
public class test{
public static void main(String args[]) throws Exception{
java.util.regex.Pattern p = java.util.regex.Pattern.compile("^4\1");
java.util.regex.Matcher m = p.matcher("12454");
if(m.find())
System.out.println(m.group());
//String sysDate = new java.text.SimpleDateFormat("yyyyMMdd_HH_mm_ss").format(Calendar.getInstance().getTime());
//System.out.println(sysDate);
//for(int i=0;i<128;i++)
// System.out.println(i+","+((char)i));
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream("test.java")));
String x = "";
String y = "";
while((x=br.readLine())!=null)
y += x+"\n";
br.close();

String s = "2\"13\\\"//23\\\"857\"6\n2\"13\"/*23\"857\"6";
s = y;
String tmp = "",result = "",tmp_2="";
char[] c = s.toCharArray();
boolean b1 = true,b2 = false;
Map<String,String[]> map = new HashMap<String,String[]>();
map.put("\"",new String[]{"\"","\n"});
map.put("//",new String[]{"\n"});
map.put("/*",new String[]{"*/"});
s += "\n";
String clouser[] = null;
for(int i=0;i<c.length-1;i++){

/*
if(x2==0&&x1==0&&c[i]=='/')
x1++;
else if(x2==0&&x1==1&&c[i]=='/')
x1++;
else if(x2==0&&x1==1&&c[i]=='*')
x1+=2;
else if(x1<2&&x2==0&&c[i]=='"')
x2++;
else if(x2==1&&c[i]=='"')
x2--;
else if(c[i]=='\n')
x2=x1=0;*/
tmp = ""+c[i]+c[i+1];
if(tmp.equals("\\\"")){tmp_2+=tmp;i++;
continue;}else if(tmp.equals("\\\\")){tmp_2+=tmp;i++;
continue;}
if(b1){
if(map.containsKey(""+c[i])){
b1 = false;
b2 = true;
clouser = (String[])map.get(""+c[i]);
tmp_2 = "";
continue;
}else if(map.containsKey(tmp)){
b1 = b2 = false;
clouser = (String[])map.get(tmp);
tmp_2 = "";
i++;
continue;
}
}else{
//System.out.println("========="+clouser+","+c[i]+(clouser.charAt(0)==c[i]));
if(clouser!=null){

for(int j=0;j<clouser.length;j++){
//System.out.println(java.util.Arrays.asList(clouser));
if(clouser[j].charAt(0)==c[i]||clouser[j].equals(tmp)){
if(c[i]=='\n')
tmp_2 = "";
clouser = null;
if(b2)
result += tmp_2+"\n";
tmp_2 = "";
b1=true;
b2=false;
break;
}}}
}
tmp_2+=c[i];
//System.out.println(b2+","+result+","+tmp);
}
System.out.println(s);
System.out.println(result);
String s22 = "2中ss文+" + "2yin\\\"中文\"" + "2中文"; //String s = "2中ss文+" + "2yin\\\"中文\"" + "2中文";
String s23 = "2中ss文+" + "2yin\\\"中文\"" + "2中文"; /*String s = "2中ss文+" + "2yin\\\"中文\"" + "2中文";
String s = "2中ss文+" + "2yin\\\"中文\"" + "2中文";
String s = "2中ss文+" + "2yin\\\"中文\"" + "2中文";*/String s25 = "2中ss文x+" + "2yin\\\"中文\"" + "2中文";
String s24 = "2中ss文+" + "2yin\\\"中文\"" + "2中/*文"+"2中ss文+" + "2yin\\\"中文\"" + "2中文";
//new Sudoku(3,new int[][]{{0,3,5},{0,6,4},{1,8,1},{2,0,7},{2,3,2},{3,3,9},{3,7,5},{4,2,6},{5,1,4},{5,2,1},{5,6,3},{6,4,4},{6,6,8},{6,8,6},{7,0,9},{7,8,5},{8,5,1}});
//{13,14,15},{3,4,8},{6,4,7},{9,3,12},{8,3,4},{10,8,14},{12,5,13},{10,4,10},{0,1,7},{1,2,1},{1,8,4}}
}
}

写了一个,暂时还没发现有什么问题...

^4\1
12454
test.java


\n
2\"13\\\"//23\\\"857\"6\n2\"13\"/*23\"857\"6



\"
\"
\n
//
\n
/*
*/
\n



\\\"
\\\\





\n

2中ss文+
2yin\\\"中文\"
2中文
2中ss文+
2yin\\\"中文\"
2中文
2中ss文x+
2yin\\\"中文\"
2中文
2中ss文+
2yin\\\"中文\"
2中/*文
2中ss文+
2yin\\\"中文\"
2中文


F:\java>

  • 打赏
  • 举报
回复
[Quote=引用 43 楼 ooo19841080xinxin 的回复:]
谢谢火龙大哥了
String s = "2中ss文+" + "2yin\\\"中文\"" + "2中文";
这类的好像还没有解决,昨天想了一下没有想到很好的方案
[/Quote]

不会啊,这个能提取出

"2中ss文+"
"2yin\\\"中文\""
"2中文"

啊?

而且你在 27 楼的示例中也是给出的。
ooo19841080xinxin 2008-10-08
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 bao110908 的回复:]
我想想看
[/Quote]
看到很多地方用到 ?: 看不太明白
zapdos 2008-10-08
  • 打赏
  • 举报
回复
其实,这个问题可以看作是4对互不相关的括号
只要按照以下规则就可以抽取出来
A:"和"
B:"和\n
C://和\n
D:/*和*/
另外,这4对括号是互斥的
\\和\"直接成对吞入
只要把A和B括号里的汉字抽取出来就OK了
hjy273 2008-10-08
  • 打赏
  • 举报
回复
顶起 学习
ooo19841080xinxin 2008-10-08
  • 打赏
  • 举报
回复
谢谢火龙大哥了
String s = "2中ss文+" + "2yin\\\"中文\"" + "2中文";
这类的好像还没有解决,昨天想了一下没有想到很好的方案
wudongchina 2008-10-08
  • 打赏
  • 举报
回复
不错,收藏,正则表式好厉害!!学习一下!!
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 qiandongbo 的回复:]
那几个正则好麻烦,慢慢看起~
[/Quote]

呵呵,这几个不是麻烦了,是极其麻烦了,专家写的东西,为了防止循环匹配,已经优化过了。

[^\\\\\"] 表示除了 \ 和 " 之外的其他字符。
Java 代码中的正则表达式使用 \\\\ 表示 \ 字符,因为 \\\\ 在 Java 编译后会变成 \\,
而这个被正则表达式引擎编译后就成 \ 字符了,这里经过了双重转义。使用 \" 表示 ",因此
就是 \\\\\" 了。

\\\\.[^\\\\\"]* 表示匹配 \ 加任意字符后面跟着非 \ 和 " 字符,比如:\\abc 或者 \"abc 或者 \t 什么的。这样做的目的是为了处理:
"hello, \"qiandongbo\""

而且 "hello, qiandongbo\\" 这种形式最后的 \" 不至于会被认为是转义的引号。

呵呵,复杂吧,弄这个脑子得高度清醒,否则一下子就糊涂掉了 ^_^
qiandongbo 2008-10-07
  • 打赏
  • 举报
回复
[^\\\\\"]这个没整明白啥回事~与[^\"]有啥区别哦?
qiandongbo 2008-10-07
  • 打赏
  • 举报
回复
那几个正则好麻烦,慢慢看起~
  • 打赏
  • 举报
回复
那个程序你试试看,还可以再优化一下,比如说:

1,可以先找找读出的一行中是否用引号,没有的话直接 continue,下面的“抽取所有的字符串”都可以不用做了,
如果有引号的话,那就很难说了,因为引号可能是在字符串中的,也可能是在注释中的。

2,在“抽取所有的字符串”后如果 str 为空串(说明引号是在注释中的,语句中没有引号),那也可以 continue,
下面的“抽取所有的带汉字的字符串”也可以不用做了。
ooo19841080xinxin 2008-10-07
  • 打赏
  • 举报
回复
大家帮忙看看9楼这种情况
  • 打赏
  • 举报
回复
忽略单行注释那里

if(comment1.reset(str).matches() || comment2.reset(str).matches()) {
continue;
}

由于去掉了首尾的空格,可以改为:

if(str.startsWith("//") || (str.startsWith("/*") && str.endsWith("*/"))) {
continue;
}


我感觉最麻烦的就是注释的处理和字符串中的各种转义引号什么的。

PS:注释和字符串的表达式来自 Mastering Regular Expressions 一书,正则表达式顶级专家写的,呵呵。
ooo19841080xinxin 2008-10-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bao110908 的回复:]
引用 7 楼 ooo19841080xinxin 的回复:
引用 1 楼 java2000_net 的回复:
String zhPattern = "[\u4e00-\u9fa5]+";
这个是提取汉字。你最好给个例子,和你期望的结果!

我想把比如这样的
String s1 = "嘿嘿 ";
String s1 = "throw new Exception(\"已经超过20项笔记。\");";
将\"已经超过20项笔记。\"将这段提取出来
反正是双引号之间的


题意都不明确!

\"已经超过20项笔记。\"

其中的“20”、“。”是汉字么…
[/Quote]
是这样的
双引号之间有汉字就把它都提取出来
加载更多回复(33)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧