关于POSIX正则表达式中,字符类里如果有右中括号]和反斜杠\,该如何写?

dubiousway 2008-12-01 11:05:09
关于POSIX正则表达式中,字符类里如果有右中括号]和反斜杠\,该如何写?

今天碰到一个很别扭的问题,搞得很糊涂。用ereg函数匹配的问题

我的PHP版本是 5.2.5。

[CODE]
$s='xyz]\hi[jk'; //待搜索字符串
$d='[]]'; //模式字符串
ereg(($d, $s, $c);
[/CODE]
上面的结果返回true,匹配字符是] 。(我也不知道是怎么匹配的)

如果改成[CODE]$d='[]\]';[/CODE] 返回true,匹配字符还是 ] 。

但如果写成[CODE]$d='[\]]';[/CODE] 返回false。
看网上的资料应该用转意字符\,但不管我写成[CODE]$d='[\\]]';[/CODE],还是写成[CODE]$d='[\\\]]';[/CODE],其结果都返回false。

我用[:punct:]搜索可以匹配到字符],但如果按照书上写的,把[:punct:] 的扩展表达式[-!"#$%&'( )*+,./:;<=>?@[\\\]^_'{|}~]代到$d里,结果也是错?! 这到底怎么回事,书上写错了?

网上的书上还说[^\]]匹配任一不是右括号的字符,但 ereg("[^\]]","abcd") 返回false。。。

晕死,到底是书上错,还是我理解错,还是我php 有bug。

请大家指教一下。谢谢!
...全文
279 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dubiousway 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jakey9826 的回复:]
int ereg ( string $pattern, string $string [, array &$regs] )
string ereg_replace ( string $pattern, string $replacement, string $string )

应该用ereg_replace吧.
\] \\\
[/Quote]

没看明白,你最后一行 \] \\\ 是想说明怎么表示 ] 吗,我没看懂,能否详细些。
作不作替换没关系,我不关心用replace,还是不用,就想知道为什么用\转义字符类[]中的字符],不起作用。和书上写得怎么不一样呢?
dubiousway 2008-12-01
  • 打赏
  • 举报
回复
搞了一晚上,我总算彻底明白转义字符的问题了。痛快。
比较繁琐,正则表达式有时候确实晦涩。主要是转义字符的重复问题,特别是又出现在尾部的时候。

虽然两位没有说到关键,不过还是十分感谢。3Q!!
程序猿之殇 2008-12-01
  • 打赏
  • 举报
回复
int ereg ( string $pattern, string $string [, array &$regs] )
string ereg_replace ( string $pattern, string $replacement, string $string )

应该用ereg_replace吧.
\] \\\
dubiousway 2008-12-01
  • 打赏
  • 举报
回复
重发:


今天碰到一个很别扭的问题,搞得很糊涂。用ereg函数匹配的问题

我的PHP版本是 5.2.5。


$s='xyz]\hi[jk'; //待搜索字符串
$d='[]]'; //模式字符串
ereg(($d, $s, $c);

上面的结果返回true,匹配字符是] 。(我也不知道是怎么匹配的)

如果改成
$d='[]\]';
返回true,匹配字符还是 ] 。

但如果写成
$d='[\]]';
返回false。
看网上的资料应该用转意字符\,但不管我写成
$d='[\\]]';
,还是写成
$d='[\\\]]';
,其结果都返回false。

我用[:punct:]搜索可以匹配到字符],但如果按照书上写的,把[:punct:] 的扩展表达式[-!"#$%&'( )*+,./:;<=>?@[\\\]^_'{|}~]代到$d里,结果也是错?! 这到底怎么回事,书上写错了?

书上还说[^\]]匹配任一不是右括号的字符,但 ereg("[^\]]","abcd") 返回false。。。

晕死,到底是书上错,还是我理解错,还是我php 有bug。

请大家指教一下。谢谢!
foolbirdflyfirst 2008-12-01
  • 打赏
  • 举报
回复
平时很少用posix的正则式,一般都用perl的正则式,posix正则式里,反斜杠'\'并不是一个特殊字符,这是个很关键的区别.
参考一下:http://www.regular-expressions.info/posixbrackets.html
程序猿之殇 2008-12-01
  • 打赏
  • 举报
回复
\]表示]
前言:本资源来自于javaeye,原资源链接地址:http://www.javaeye.com/topic/67398 原文如下: 以前了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类用到了 jakarta-oro-2.0.jar 包,请大家自己在 apache网站下下载 在这是junit测试单元类我就不提交了,在main()方法有几个小测试,有兴趣自己玩吧. 这个工具类目前主要有25种正规表达式(有些不常用,但那时才仔细深入的研究了一下正规,上瘾了,就当时能想到的都了): 1.匹配图象; 2 匹配email地址; 3 匹配匹配并提取url ; 4 匹配并提取http ; 5.匹配日期 6 匹配电话; 7 匹配身份证 8 匹配邮编代码 9. 不包括特殊字符的匹配 (字符不包括符号 数学次方号^ 单引号' 双引号" 分号; 逗号, 帽号: 数学减号- 右尖括号> 左尖括号 0) 12 匹配正整数 13 匹配非正整数(负整数 + 0) 14 匹配负整数; 15. 匹配整数 ; 16 匹配非负浮点数(正浮点数 + 0) 17. 匹配正浮点数 18 匹配非正浮点数(负浮点数 + 0) 19 匹配负浮点数; 20 .匹配浮点数; 21. 匹配由26个英文字母组成的字符串; 22. 匹配由26个英文字母的大组成的字符串 23 匹配由26个英文字母的小组成的字符串 24 匹配由数字和26个英文字母组成的字符串; 25 匹配由数字、26个英文字母或者下划线组成的字符串; java源码: /* * Created on 2005-4-15 * * Summary of regular-expression constructs 正则表达式结构简介: * Construct Matches * Characters 字符: * x The character x x 字符 x * \\ The backslash character \\ 反斜杠 * \0n The character with octal value 0n (0 <= n <= 7) \0n 十进制数 (0 <= n <= 7) * \0nn The character with octal value 0nn (0 <= n <= 7) \0nn 十进制数 0nn (0 <= n <= 7) * \0mnn The character with octal value 0mnn (0 <= m <= 3, 0 <= n <= 7) \0mnn 十进制数 0mnn (0 <= m <= 3, 0 <= n <= 7) * \xhh The character with hexadecimal value 0xhh \xhh 十六进制数 0x

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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