在正则表达式中,如果第一个圆括号没有't匹配,当在JavaScript中使用replace()与在Ruby中使用
In Regular Expression, if the first parenthesis doesn't match, can $1 be empty string when using replace() in JavaScript vs gsub in Ruby?
使用JavaScript,要从foo.bar
中提取前缀foo.
(包括.
),我可以使用:
> "foo.bar".replace(/('w+.)(.*)/, "$1")
"foo."
但如果没有这样的前缀,我希望它给出一个空字符串或null,但它给出了完整的字符串:
> "foobar".replace(/('w+.)(.*)/, "$1")
"foobar"
为什么$1
会给出整个字符串?——正如我认为的第一个括号。
- 也许它的意思是真正匹配的第一个括号
如果#1是真的,那么可能一种常见的标准技术是使用
?
,它在Ruby中工作:使用irb:
> "foo.bar".gsub(/('w+'.)?(.*)/, ''1') "foo." > "foobar".gsub(/('w+'.)?(.*)/, ''1') ""
因为
?
是可选的,而且它无论如何都会匹配。然而,它在JavaScript:中不起作用> "foobar".replace(/('w+.)?(.*)/, "$1") "foobar"
我可以在JavaScript中使用
match()
来做这件事,它会很干净,但只是为了更多地理解replace()
:是什么原因导致它在Ruby和JavaScript中的工作方式不同,上面的#1和#2也适用吗?和/或如果使用
replace()
不存在前缀,有什么好的替代方法可以"抓取"前缀或获取""
?
FYI,我认为JavaScript的正则表达式不正确,因为它没有转义.
(点)字符。
$1
返回整个字符串的原因是$1
诱使您相信它与第一组匹配(这不是真的)。
/* your js regex is /('w+.)/, I use /('w+'.)/ instead to demonstrate it */
"foobar".replace(/('w+'.)/, "$1"); // 'foobar'
这是因为$1
与(empty)
不匹配,所以正则表达式试图用$1
替换原始字符串foobar
(因为它与任何内容都不匹配,它只返回整个原始字符串
"foobar".replace(/('w+'.)/, '-'); // 'foobar' (No matches, so nothing get replaced)
"foobar".replace(/('w+'.)/, '$1'); // 'foobar' (No matches, $1 is empty, nothing get replaced)
"foobar.a".replace(/('w+'.)/, '-'); // '-a' (matches 'foobar.' so replaces 'foobar.' with '-') + ('a')
"foobar.a".replace(/('w+'.)/, '$1'); // 'foobar.a' (matches 'foobar.' so replaces 'foobar.' with itself) + ('a')
无论您是否成功更改了原始字符串,JavaScript中的replace方法都会为您提供原始字符串的副本。
例如:
alert( "atari.teenageRiot".replace(/5/,'reverse polarity of the neutron flow') );
//"atari.teenageRiot"
替换与查找匹配项无关。这是关于通过用第二个参数替换与第一个参数匹配的字符串来更改字符串,这样无论是否更改,都可以返回要更改的字符串。
另外,我会用这个来代替:
"foo.bar".replace(/('w+'.)(.*)/, "$1")
您在.
之前没有'
,因此它被视为与大多数字符匹配的通配符。
相关文章:
- 当在Ember中点击一个项目时,我如何将一个活动类添加到项目列表中
- 当#在iFrame中使用HTML时,阻止页面移动
- 当在文本框中搜索关键字时,我会得到以前的结果作为输出
- 当在文档中拖动mouseup/mouseleve时,我想调用我的Ajax请求
- jqueryajax调用是复制url,当在模态视图之后在外部js文件中进行调用时
- 当在coldfusion中通过AJAX传递时,FORM提交在IE浏览器中给出空表单
- 当在输入框中聚焦时,清除页面上的所有间隔
- -当在JQuery Slider上添加-webkit线性梯度时,moz线性梯度会被破坏
- AngularJS$apply有时不会;当在highchart中使用click事件时,t触发更新{{}}中html标记中
- 当在ng视图中加载新路由时,Tabbing(tabindex)针对错误的元素
- 当在EXTJS中的网格中使用时,afterrender不适用于组合框
- 为什么$q.当在Angular中后跟$q.拒绝时.js会导致成功
- 当在一个表单中进行更改时,ng-disabled 会触发所有表单验证
- 当在文本框中按下Enter键时,重定向到page.aspx
- 在正则表达式中,如果第一个圆括号没有't匹配,当在JavaScript中使用replace()与在Ruby中使用
- 当在外部js中时,Highcharts条形图中断
- 当在document.ready中使用async=true时会发生什么
- 如何“;postMessage”;当在IE9对象元素中查看时,从pdf中托管
- 仅当在文本框中输入文本时显示X按钮
- 当在堆栈底部添加ImageView时,我想删除RelativeLayout中的顶部ImageView,但它正在删除整个布