看到您回复的正则表达式有几点不懂的地方.

一品梅 2008-12-14 08:56:51
求一正则要求以//开头但前面不能有/*, 可以有/**/
示例
aa555//aaa 匹配//aaa
aa5/*55//aaa 不匹配
aa5/*sos*/55//aaa 匹配//aaa
----------------------------------------
public class Test {

public static void main(String[] args) throws IOException {
String multiComment = "/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/";
String singleComment = "//[^\r\n]*+";
String quoteString = "\"[^\\\\\"]*(?:\\\\.[^\\\\\"]*)*\"";请问这里那么多的\是什么意思有些看不懂了,quotostring是表示哪一块?
String regex = multiComment + "|" + quoteString + "|(" + singleComment + ")";

String str = FileUtil.readFile2String("f:/Test.java");
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
if(matcher.start(1) > -1) {
System.out.println(matcher.group(1));
}
}
}
}
...全文
125 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
呵呵,这个表达式是有点复杂,实在想不通的话就不用去想了,现实中也很少会用到 :)
一品梅 2008-12-14
  • 打赏
  • 举报
回复
再次地表示感谢,要消化老长时间,现在还再琢磨,哈哈.
  • 打赏
  • 举报
回复
[Quote=引用楼主 only_endure 的帖子:]
在[]里不是不需要转义吗?
[/Quote]

这是谁说的?谁说的要打谁屁屁!

正则表达式中的特殊字符有:( [ { \ ^ - $ | } ] ) ? * + . 这 15 个,其中 - 在 [ ] 外属于普通字符。

[ ] 中只有 . * + ? $ | ( ) { } 以及不在 [ ] 里第一个字符的 ^ 和在 [ ] 两边的 - 不需要转义之外,
像 [ ] \ 这三个还是需要转义的。
一品梅 2008-12-14
  • 打赏
  • 举报
回复
谢谢您.
一品梅 2008-12-14
  • 打赏
  • 举报
回复
我再仔细地看看 :)
zh2208 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bao110908 的回复:]
匹配 Java 语言中的字符串,我们并不能简单地使用 \".*?\" 或者 \"[^\"]*\" 来进行匹配,
如果是这样做的话,就没有把字符串中的引号考虑进去了。
[/Quote]

up 。。
正则表达式的 “\”转义字符还是挺有用的。。
  • 打赏
  • 举报
回复
匹配 Java 语言中的字符串,我们并不能简单地使用 \".*?\" 或者 \"[^\"]*\" 来进行匹配,
如果是这样做的话,就没有把字符串中的引号考虑进去了。
  • 打赏
  • 举报
回复
这个字符串的匹配过程可以划分成为下面几段:

"  test  \\abc  \"hello  \\  \"  "
1 2 3 4 5 6 7


3~6 段被第三部分所匹配,注意看一下规律,第三部分总是以 \ 字符开头的,而且除了 \ 之外至少还有一个其他的字符,
这也正是 Java 语言中转义所规定的语法。
  • 打赏
  • 举报
回复
quoteString 匹配双引号字符串的正则表达式,那么多的 \ 是为了转义而存在的。

\ 在 Java 字符串和正则表达式中都属于转义字符,因此在 Java 字符串中得使用 \\\\ 才能表示 \ 字符。
首先,\\\\ 被 Java 编译器转义成为 \\,之后再次被正则表达式引擎转义成为 \ 字符,这里经过了双重转义。

你看到的 \\\\\" 实际上就是 \ 和 " 两个字符。

拆成以下四个部分来看

第一部分:\"
字符串开始的引号

第二部分:[^\\\\\"]*
处理普通字符。除了 \ 和 " 之外的字符,匹配字符串中所有非引号和非带转义字符 \ 的字符。

第三部分:(?:\\\\.[^\\\\\"]*)*
处理特殊字符。因为特殊字符都是带有转义字符 \ 的,因此表达式 \\\\. 表示 \ 加另外一个字符,这样就能匹配特殊字符了。
而后面的同样是普通字符。

为了下面描述更为清楚 \\\\. 称为第三部分A,第三部分A能匹配两个字符
[^\\\\\"] 称为第三部分B。

需要注意的是第三部分B可以出现零次或多次,而整个第三部分也能出现零次或多次,也表明如果字符串中出现一个转义字符的话,
那么第三部分就开始起作用了,否则全部使用第二部分。

第四部分:\"
字符串结束的引号

比如字符串 "test\\abc\"hello\\\"";

其中的 " 被上述第一部分匹配
test 这 4 个字符被第二部分匹配

\\ 被第三部分A匹配
abc 被第三部分 B 所匹配

\" 再被第三部分A匹配
hello 这 5 个字符被第三部分 B 匹配

\\ 再次被第三部分A匹配,由于 \\ 后面又是 \ 字符,因此第三部分 B 变成零长度匹配。

接下来的 \" 再被第三部分A所匹配,再后面的字符是 " 这时第三部分 A 和 B 都不能匹配这个字符了,
因此跳出第三部分的循环状态,这时正好能被第四部分匹配,至此为止所有的字符均得到了匹配,也就是
匹配成功了。
一品梅 2008-12-14
  • 打赏
  • 举报
回复
在[]里不是不需要转义吗?
package net.csdn.java;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class Test {

/**
* "regex" // hello
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
String name = "大/*家" + "好*/啊" + "// comment"; // comment
URL url = new URL("http://localhost:8080/test/ReceiveData"); // request URL
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestMethod("POST"); // set POST request method
/* 请求头 // content-type */
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setUseCaches(false);

// add request parameters
DataOutputStream dos = new DataOutputStream(con.getOutputStream());
dos.writeBytes("name=" + URLEncoder.encode(name, "gbk"));
dos.writeBytes("&age=" + URLEncoder.encode("1234", "gbk"));
dos.flush();
dos.close();

System.out.println(con.getResponseCode());
con.disconnect();
}

/**
* 计算 2 + 22 + 222 的值
* @param num 不断增加的数字
* @param digit 总共的位数
* @return
*/
public static int add(int num, int digit) {
int n = 0;
for(int i = 1; i <= digit; i++) {
n = n * 10 + i * num;
}
return n;
}

public static void printDiamond(int line, boolean isSolid) {
boolean b = true;
for(int k = line / 2, i = -k; i <= k; i++) {
for(int j = -k, m = k - Math.abs(i); j <= m; j++) {
if(isSolid) {
// 实心菱形
b = Math.abs(j) <= m;
} else {
// 空心菱形
b = Math.abs(j) == m;
}
System.out.print(b ? '*' : ' ');
}
System.out.println();
}
}

/**
* 计算 num 的阶乘
* @param num
* @return
*/
private static int factorial(int num) {
return factorial(1, num);
}

/**
* 计算 start * (start + 1) * (start + 2) * ... * end 的值
* @param start 阶乘的起始数
* @param end 阶乘的结束数
* @return
*/
private static int factorial(int start, int end) {
if(start > end) {
int t = start;
start = end;
end = t;
}
int result = start > 0 ? start : 1;
// calculate factorial
while(end > start) {
result *= end--;
}
return result;
}
}
fuyueyue 2008-12-14
  • 打赏
  • 举报
回复
upup
zero1111 2008-12-14
  • 打赏
  • 举报
回复
\是转译符, \\代表过滤一个"\"

62,614

社区成员

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

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