如何在javascript中用等长的空格替换找到的正则表达式子字符串?

时间:2017-12-06 01:15:39

标签: javascript regex string

在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"

由于

3 个答案:

答案 0 :(得分:3)

.replace的替换参数(2nd)可以是一个函数 - 依次调用此函数,每个匹配的部分作为第一个参数

知道匹配部分的长度,您可以返回与替换值相同的空格数

在下面的代码中,我使用.作为替换值来轻松说明代码

注意:这使用String#repeat,这在IE11中不可用(但是,箭头函数也没有)但是你总是可以使用polyfill和transpiler

&#13;
&#13;
let regex = "\\d+";
console.log("123hello4567".replace(new RegExp(regex, "ig"), m => '.'.repeat(m.length)));
&#13;
&#13;
&#13;

Internet Exploder友好版

&#13;
&#13;
var regex = "\\d+";
console.log("123hello4567".replace(new RegExp(regex, "ig"), function (m) {
    return Array(m.length+1).join('.');
}));
&#13;
&#13;
&#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]长度相同的新空格来加速。这将删除循环内的正则表达式替换。如果性能不是高优先级,那么这应该可以正常工作。