在javascript中,如果我有类似
的内容def point_in_poly(x,y,poly):
n = len(poly)
inside = False
p1x,p1y = poly[0]
for i in range(n+1):
p2x,p2y = poly[i % n]
if y > min(p1y,p2y):
if y <= max(p1y,p2y):
if x <= max(p1x,p2x):
if p1y != p2y:
xints = (y-p1y)*(p2x-p1x)/float(p2y-p1y)+p1x
if p1x == p2x or x <= xints:
inside = not inside
p1x,p1y = p2x,p2y
return inside
## Test
polygon = [(0,11),(11,10),(11,0),(0,1)]
point_x = 12
point_y = 12
## Call the function with the points and the polygon
print (point_in_poly(point_x,point_y,polygon))
这将用一个空格替换所有找到的正则表达式。但是,如果我想用长度匹配的空格替换所有找到的正则表达式,我该怎么办呢?
所以如果正则表达式是string.replace(new RegExp(regex, "ig"), " ")
,那么字符串是
\d+
它变为
"123hello4567"
由于
答案 0 :(得分:3)
.replace的替换参数(2nd)可以是一个函数 - 依次调用此函数,每个匹配的部分作为第一个参数
知道匹配部分的长度,您可以返回与替换值相同的空格数
在下面的代码中,我使用.
作为替换值来轻松说明代码
注意:这使用String#repeat,这在IE11中不可用(但是,箭头函数也没有)但是你总是可以使用polyfill和transpiler
let regex = "\\d+";
console.log("123hello4567".replace(new RegExp(regex, "ig"), m => '.'.repeat(m.length)));
&#13;
Internet Exploder友好版
var regex = "\\d+";
console.log("123hello4567".replace(new RegExp(regex, "ig"), function (m) {
return Array(m.length+1).join('.');
}));
&#13;
感谢@nnnnnn更短的IE友好版
答案 1 :(得分:0)
"123hello4567".replace(new RegExp(/[\d]/, "ig"), " ")
1 => " "
2 => " "
3 => " "
" hello "
"123hello4567".replace(new RegExp(/[\d]+/, "ig"), " ")
123 => " "
4567 => " "
" hello "
答案 2 :(得分:0)
如果您只想用空格替换每个数字,请保持简单:
var str = "123hello4567";
var res = str.replace(/\d/g,' ');
" hello "
这回答了你的例子,但不完全是你的问题。如果正则表达式可以根据字符串在不同数量的空格上匹配,或者它不像/ d那么简单怎么办?你可以这样做:
var str = "123hello456789goodbye12and456hello12345678again123";
var regex = /(\d+)/;
var match = regex.exec(str);
while (match != null) {
// Create string of spaces of same length
var replaceSpaces = match[0].replace(/./g,' ');
str = str.replace(regex, replaceSpaces);
match = regex.exec(str);
}
" hello goodbye and hello again "
将循环执行正则表达式(而不是使用/ g表示全局)。
性能方面,这可能会通过创建一个长度与match [0]长度相同的新空格来加速。这将删除循环内的正则表达式替换。如果性能不是高优先级,那么这应该可以正常工作。