请教一些关于正则表达式的问题

无·法 社区初级成员 T1 2010-04-25 10:01:51
1.正则表达式如何由一个变量组成?
对于match或者replace方法,如果使用正则的话表达式放在两斜杠(//)之间,这两个斜杠之间是个常量,如果我的表达式是由一个变量组成的,例如:
var p="\\d";
alert("a123".match(/p/g));

显然不行的,网上找了很多方法最后发现用new RegExp声明个正则对象,然后用exec方法,这样虽然可以解决,不过我仍希望用match可以办到。


2.用match匹配后如何依次访问用括号捕获的内容?
var a=("123-8test888-9hehe".match(/(\d{3})\-(\d)/g));
alert(a[0]);//显示的是123-8
alert(a[1]);//显示的是888-9

如果我要显示123如何写?
alert(a[0][0]);//无效,显示的是1,好像的当作字符串数组访问了
alert(a[0].$1);//我猜测的,显然也是无效,呵呵

我知道这个用new RegExp结合exec也可以办到,但是就用match是否可以?
...全文
142 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
无·法 社区初级成员 T1 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zswang 的回复:]

{xxx}、[xxx]、/xxx/
这些统称字面量,即:在代码中声明对象的一种简写方式。

{xxx} ==> new Object()
[xxx] ==> new Array()
/xxx/ ==> new RegExp()

字面量也可以按json的解析方式获得对象。
JScript code
var p="\\d";
alert("a123".match(eval("(/……
[/Quote]
算了,还是结贴了,问题其实已经解决了,你的回答帮我解决了另一个问题。
火狐扩展FillForm的更新数据文件部分需要用变量构造成正则表达式来replace,而你的回答正好解决了这一难题,您的id已经被添加入贡献者列表。
无·法 社区初级成员 T1 2010-04-27
  • 打赏
  • 举报
回复
无·法 社区初级成员 T1 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zswang 的回复:]
JScript code
var str = "123-8test888-9hehe";
var re = /(\d{3})\-(\d)/g;
var match;
while ((match = re.exec(str)) != null)
alert([RegExp.$1, RegExp.$2]);
[/Quote]
我现在就是这样用的,只是在寻找出exec之外的办法,因为exec有几个缺陷:1.无法一次性匹配所有。2.无法直接得到有多少个匹配结果。3.无法得到有多少个字匹配。
while (match = re.exec(str))//这样写也可以的吧
无·法 社区初级成员 T1 2010-04-25
  • 打赏
  • 举报
回复
我知道了,match返回的就是个一维数组,有没有括号捕获是一样的。
RegExp.$1是有个有意思的玩意,可有可无,要是它可以再加1维就完美了。
王集鹄 2010-04-25
  • 打赏
  • 举报
回复

var str = "123-8test888-9hehe";
var re = /(\d{3})\-(\d)/g;
var match;
while ((match = re.exec(str)) != null)
alert([RegExp.$1, RegExp.$2]);
无·法 社区初级成员 T1 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zswang 的回复:]

JScript code
var str = "123-8test888-9hehe";
var match = str.match(/(\d{3})\-(\d)/g, str);
for(var i = 0; i < match.length; i++) {
alert(match[i]);
}
[/Quote]
这个我知道,打印的是一维的,我主要是要访问括号捕获的内容,有办法吗?
RegExp.$1和RegExp.$2也只能访问第一个匹配的结果啊,没有办法访问所有的吗?
王集鹄 2010-04-25
  • 打赏
  • 举报
回复
var str = "123-8test888-9hehe";
var match = str.match(/(\d{3})\-(\d)/g, str);
for(var i = 0; i < match.length; i++) {
alert(match[i]);
}
无·法 社区初级成员 T1 2010-04-25
  • 打赏
  • 举报
回复
在VBS中有matchs(0).SubMatches(0)
matchs(0)表示主匹配,像上面的就是123-8
matchs(0).SubMatches(0)表示子匹配,要访问第几个子匹配就在SubMatches后面写,这样用两个for循环就可以打印出所有的值了,js里我是纠结了很长时间啊。
无·法 社区初级成员 T1 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zswang 的回复:]

{xxx}、[xxx]、/xxx/
这些统称字面量,即:在代码中声明对象的一种简写方式。

{xxx} ==> new Object()
[xxx] ==> new Array()
/xxx/ ==> new RegExp()

字面量也可以按json的解析方式获得对象。
JScript code
var p="\\d";
alert("a123".match(eval("(/……
[/Quote]
谢谢你的回答
上面用alert(RegExp.$1);返回的是123,如果要返回下一个匹配的呢?也就是如何再继续得到888呢
王集鹄 2010-04-25
  • 打赏
  • 举报
回复
{xxx}、[xxx]、/xxx/
这些统称字面量,即:在代码中声明对象的一种简写方式。

{xxx} ==> new Object()
[xxx] ==> new Array()
/xxx/ ==> new RegExp()

字面量也可以按json的解析方式获得对象。
var p="\\d";
alert("a123".match(eval("(/" + p + "/)")));


---
String.match返回的结果就是一个string数组。
var a=("123-8test888-9hehe".match(/(\d{3})\-(\d)/g));
alert(typeof a[0]); // string

$1、$2不是RegExp的prototype的属性,而是RegExp的直接属性(RegExp为构造函数)。
var a=("123-8test888-9hehe".match(/(\d{3})\-(\d)/g));
alert(RegExp.$1);
无·法 社区初级成员 T1 2010-04-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 only_endure 的回复:]

上面用alert(RegExp.$1);返回的是123,如果要返回下一个匹配的呢?也就是如何再继续得到888呢
--
RegExp.$2
[/Quote]
你没明白我的意思吧?
RegExp.$2返回的是8,不是888,你可以测试下,RegExp只保存了第一个匹配结果。
一品梅 2010-04-25
  • 打赏
  • 举报
回复
上面用alert(RegExp.$1);返回的是123,如果要返回下一个匹配的呢?也就是如何再继续得到888呢
--
RegExp.$2

87,914

社区成员

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

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