关于正则表达式的问题...

justinavril 2008-09-27 08:23:54
今天本来在写一篇blog,链接是:http://blog.csdn.net/justinavril/archive/2008/09/27/2989671.aspx 就是论坛里的一个人问的如何匹配一个blog里的IP地址等他需要的信息,帖子的链接是:http://topic.csdn.net/u/20080926/20/9134c188-b7b1-4006-8515-2d5356df8959.html


我的问题就是在匹配IP地址时,是IP V4的地址啊,开始我用的是最基本的:\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3},然后我观察发现前3个字节后面都有一个“.”,所以我就这么写了:[\\d{1,3}.]{3}\\d{1,3},结果硬是不对啊,当我换成:[\\d{1,3}.]{3,}\\d{1,3},就是在3后面加上一个“,”号时,也就是让它至少匹配3次,结果就对了,能去匹配IP地址了,我觉得挺郁闷的啊...为什么正好三次就不行呢?难道还是我哪个弯没绕过来...
...全文
159 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
justinavril 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 bao110908 的回复:]
组有两种:(?: ) 是非捕获组,( ) 是捕获组的形式,至于两者的区别,可以看看
http://topic.csdn.net/u/20080503/01/3c82b040-43b9-4b44-847d-07b366285957.html
13 楼的回复。
[/Quote]
了解了 我去学习看看 然后把他们测试下 写到blog里 谢谢
  • 打赏
  • 举报
回复
组有两种:(?: ) 是非捕获组,( ) 是捕获组的形式,至于两者的区别,可以看看
http://topic.csdn.net/u/20080503/01/3c82b040-43b9-4b44-847d-07b366285957.html
13 楼的回复。
sunyujia 2008-09-27
  • 打赏
  • 举报
回复
晕了,吃过饭没刷新帖子直接回复了,没想到有这么多回帖了,不好意思了,我以为我会在6楼
sunyujia 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 justinavril 的回复:]
引用 1 楼 bao110908 的回复:
呵呵,你写了三个表达式,没有一个是正确的!

\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}
. 号在正则表达式中有特殊的意义,需要转义。

[\\d{1,3}.]{3}\\d{1,3} 和 [\\d{1,3}.]{3,}\\d{1,3} 这两个完全是牛头不对马嘴的表达式。
[\\d{1,3}.] 这个表示匹配 0-9、左大括号、数字1、半角逗号、数字3、右大括号和字符点中的一个。

使用 \\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3} 或者 \\d…
[/Quote]
也不对,用这个192{.168.0.验证你的表达式试试便知道,
火龙果已经说的很清除了,慢慢看,别着急

[\\d{1,3}.] 这个表示匹配 0-9、左大括号、数字1、半角逗号、数字3、右大括号和字符点中的一个。
justinavril 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bao110908 的回复:]
[\\d{1,3}.]{3}\\d{1,3} 中的 [\\d{1,3}.]{3} 这个只能匹配可怜的 3 个字符。

blog 中你写的表达式是这样的:


Java codeString regex = "([\\d{1,3}\\.]{3}\\d{1,3})\\s-\\s-\\s\\[([^\\]]+)\\]\\s\"GET\\s(/[^\"]+)\"\\s";



根据 ([\\d{1,3}\\.]{3}\\d{1,3}) 后面的条件,这个只能匹配:两个数字 + 点 + 一个或两个或三个数字,
即 IP 地址最后一段和倒数第二段中的后两个数字。
[/Quote]
我知道我为什么错了 我吧[]理解成了()了 然后也匹配出我想要的答案了 结果就以为是正确的了 幸亏火龙果看见了 呵呵
justinavril 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bao110908 的回复:]
引用楼主 justinavril 的帖子:
所以我就这么写了:[\\d{1,3}.]{3}\\d{1,3},结果硬是不对啊


知道为什么不对么?因为这个表达式就是不正确的。

你没弄明白 [\\d{1,3}.]{3} 这个表示啥意思!这个我在 1 楼已经说明过了,即:

[\\d{1,3}.] 这个表示匹配 0-9、左大括号、数字1、半角逗号、数字3、右大括号和字符点中的一个。

注意一下“(其)中的一个”,这是字符组“[ ]”的特性所决定的。举个例子:

[abc…
[/Quote]
懂了 组的形式 都是像你写的那种形式吗?(?:\\d{1,3}\\.){3}\\d{1,3} 也就是说(?:匹配的字符串)是标准的组形式吗?
  • 打赏
  • 举报
回复
[\\d{1,3}.]{3}\\d{1,3} 中的 [\\d{1,3}.]{3} 这个只能匹配可怜的 3 个字符。

blog 中你写的表达式是这样的:

String regex = "([\\d{1,3}\\.]{3}\\d{1,3})\\s-\\s-\\s\\[([^\\]]+)\\]\\s\"GET\\s(/[^\"]+)\"\\s"; 


根据 ([\\d{1,3}\\.]{3}\\d{1,3}) 后面的条件,这个只能匹配:两个数字 + 点 + 一个或两个或三个数字,
即 IP 地址最后一段和倒数第二段中的后两个数字。
  • 打赏
  • 举报
回复
[Quote=引用楼主 justinavril 的帖子:]
所以我就这么写了:[\\d{1,3}.]{3}\\d{1,3},结果硬是不对啊
[/Quote]

知道为什么不对么?因为这个表达式就是不正确的。

你没弄明白 [\\d{1,3}.]{3} 这个表示啥意思!这个我在 1 楼已经说明过了,即:

[\\d{1,3}.] 这个表示匹配 0-9、左大括号、数字1、半角逗号、数字3、右大括号和字符点中的一个

注意一下“(其)中的一个”,这是字符组“[ ]”的特性所决定的。举个例子:

[abc]{3} 表示匹配三次 a 或 b 或 c,匹配到的字符数量总共是 3 个,而并不是你所想的匹配 abc 三次!

要让 [\\d{1,3}.]{3}\\d{1,3} 正确,改成组的形式就可以了:(?:\\d{1,3}\\.){3}\\d{1,3}
justinavril 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bao110908 的回复:]
引用 4 楼 justinavril 的回复:
我想问的是[\\d{1,3}\\.]{3,}\\d{1,3}和[\\d{1,3}\\.]{3}\\d{1,3}的区别 这个对吧?


当然不一样了,先不说这个表达式是否正确。

前者的量词是 {3,} 后者是 {3},前者匹配 3 次或 3 次以上,而后者只匹配 3 次。
[/Quote]
你看下我的帖子嘛 我知道这个 ……^_^
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 justinavril 的回复:]
我想问的是[\\d{1,3}\\.]{3,}\\d{1,3}和[\\d{1,3}\\.]{3}\\d{1,3}的区别 这个对吧?
[/Quote]

当然不一样了,先不说这个表达式是否正确。

前者的量词是 {3,} 后者是 {3},前者匹配 3 次或 3 次以上,而后者只匹配 3 次。
justinavril 2008-09-27
  • 打赏
  • 举报
回复
这个误会搞大了 哎 大家记住


以后千万不能边吃苹果边发帖子
sagezk 2008-09-27
  • 打赏
  • 举报
回复
import java.util.Scanner;
import java.util.regex.Pattern;

public class IPregex {

public static void main(String[] args) {
final String IP_REGEX = "(?:(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
Pattern p = Pattern.compile(IP_REGEX);
Scanner s = new Scanner(System.in);
String t = null;
do {
if ((t = s.nextLine()) == null) continue;
if ((t = t.trim()).length() == 0) continue;
System.out.print("input:");
System.out.print(t);
System.out.print(", match:");
System.out.print(p.matcher(t).matches());
System.out.println();
} while (!"exit".equalsIgnoreCase(t));
}

}
suever 2008-09-27
  • 打赏
  • 举报
回复
(\\d{1,3}\\.){3}\\d{1,3}
huoyutu 2008-09-27
  • 打赏
  • 举报
回复
/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
sunyujia 2008-09-27
  • 打赏
  • 举报
回复
还是csdn的正则大师 火龙果 分析的透彻.
学习.
justinavril 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bao110908 的回复:]
呵呵,你写了三个表达式,没有一个是正确的!

\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}
. 号在正则表达式中有特殊的意义,需要转义。

[\\d{1,3}.]{3}\\d{1,3} 和 [\\d{1,3}.]{3,}\\d{1,3} 这两个完全是牛头不对马嘴的表达式。
[\\d{1,3}.] 这个表示匹配 0-9、左大括号、数字1、半角逗号、数字3、右大括号和字符点中的一个。

使用 \\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3} 或者 \\d{1,3}(?:\\.\\d{1,3}){3} 试试看…
[/Quote]
晕 我自己编辑帖子出错了 晕

我那个blog里的是对的 我不是复制的

我想问的是[\\d{1,3}\\.]{3,}\\d{1,3}和[\\d{1,3}\\.]{3}\\d{1,3}的区别 这个对吧?
cupoy 2008-09-27
  • 打赏
  • 举报
回复
不明白等待高手
ker79 2008-09-27
  • 打赏
  • 举报
回复
帮顶
  • 打赏
  • 举报
回复
呵呵,你写了三个表达式,没有一个是正确的!

\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}
. 号在正则表达式中有特殊的意义,需要转义。

[\\d{1,3}.]{3}\\d{1,3} 和 [\\d{1,3}.]{3,}\\d{1,3} 这两个完全是牛头不对马嘴的表达式。
[\\d{1,3}.] 这个表示匹配 0-9、左大括号、数字1、半角逗号、数字3、右大括号和字符点中的一个。

使用 \\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3} 或者 \\d{1,3}(?:\\.\\d{1,3}){3} 试试看。

62,615

社区成员

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

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