关于正则《零宽断言语法》的一点点疑问。求进来指教或一起学习。

Left_you 2011-10-20 06:27:16
① (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
② (?=exp) 匹配exp前面的位置
③ (?<=exp) 匹配exp后面的位置
④ (?!exp) 匹配后面跟的不是exp的位置
⑤ (?<!exp) 匹配前面不是exp的位置

①、③,⑤貌似有语法错误。

②和④ 求具体例子,以及详细的说明。
...全文
81 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr-Jee 2011-10-21
  • 打赏
  • 举报
回复
var str = 'Zheng Yi Jian';
var reg = /^(\S+)\s*(\S+)\s*(\S+)$/;
var m = reg.exec(str);
alert(m[1]);

举个例子吧。。。
具体的方法很多 这个应该算简单的。
Left_you 2011-10-21
  • 打赏
  • 举报
回复
理解了!
只是我还想问一个, 捕获到的字符串能不能放到javascript的变量里面去?

比如: /^(\d{0,10}) (\d{0,10}) (\d{0,10})$/ 这个匹配一个外国人名字,假如我想拿到他的first name 放到变量 fname里面,怎么做?有直接的方法吗?
这个,间接的思路倒是有,比如substr()、substring()、replace()之类的。

中午结贴...
q107770540 2011-10-21
  • 打赏
  • 举报
回复
顶楼上

正则表达式在不同的语言下,所支持的语法也不同
如JS就不支持命名捕获组和逆序环视

对正则支持最好的还是。NET
Mr-Jee 2011-10-21
  • 打赏
  • 举报
回复
① (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
② (?=exp) 匹配exp前面的位置
③ (?<=exp) 匹配exp后面的位置
④ (?!exp) 匹配后面跟的不是exp的位置
⑤ (?<!exp) 匹配前面不是exp的位置

首先 javascript不支持1 3 5 即命名分组、逆序环视。
其次 断言的作用是做一次预查,预判断。比如
^(?!a)abc
在匹配"bcdef"的时候
首先从开始进行匹配,当走到(?!a)的时候先判断"bcdef"中的b位置是否是a,如果是,则匹配失败,本例中是b而不是a,所以(?!a)没有匹配,所以负断言就成立,接下来开始匹配abc,这个时候还是从b的位置开始匹配(重点:断言是不占据匹配字符的,因此又叫零宽断言),本正则本身是个矛盾的正则,所以不可能匹配。具体的,可以参考《精通正则表达式》一书,或楼上所说过客的正则博客。都是非常优秀的资料
诺维斯基 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 left_you 的回复:]
(?!1)\d* 这个匹配 不以1开头的数字
(?!1|2)\d* 这个匹配 不以1或2开头的数字

问题就是 (?=exp)了, 不了解。。。
尤其是(?=exp)和(?!exp)组合来匹配字符串的头尾部分,不知道怎么写了。

所以这里主要是求(?=exp) 以及(?=exp)、(?!exp)组合的例子。
顺便问问①、③,⑤是不是真的有语法错误?因为那个检测正则表达式的工具是……
[/Quote]

lz 听说过“过客”没有,对于在这里,学习正则的人来说 ,不知道的话,可就有点遗憾了。

给:http://blog.csdn.net/lxcnn/article/details/4304754
肯定对你有帮助。
另外祝你:早成正则大道!!
峭沙 2011-10-20
  • 打赏
  • 举报
回复
①(pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
②(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
③(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
④(?!pattern) 负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

没见过(?<=exp),(?<!exp)这样的写法
Left_you 2011-10-20
  • 打赏
  • 举报
回复
(?!1)\d* 这个匹配 不以1开头的数字
(?!1|2)\d* 这个匹配 不以1或2开头的数字

问题就是 (?=exp)了, 不了解。。。
尤其是(?=exp)和(?!exp)组合来匹配字符串的头尾部分,不知道怎么写了。

所以这里主要是求(?=exp) 以及(?=exp)、(?!exp)组合的例子。
顺便问问①、③,⑤是不是真的有语法错误?因为那个检测正则表达式的工具是我自己写的,用的javascript。

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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