1

我有这个字符串,我试图通过添加一个 _# 来增加每个单词/属性,其中 # 是{.

 str = 'View{Image{BackgroundImage: Image.png;Position: 0, 0;Width: 320;Height: 480;}Button{BackgroundImage: ButtonTop.png;Position: 61, 83;Width: 217;Height: 58;}Button_2{BackgroundImage: ButtonBottom.png;Position: 21, 303;Width: 217;Height: 58;}}'

过去我使用过这个正则表达式,但它不起作用,我不知道为什么。

var i = {};
str = str.replace(/(\S+):{/g, function (m, p1) {
            i[p1] = (i[p1] || 0) + 1;
            return p1 + "_" + i[p1].toString() + ":{";
        });

期望的输出是:

str = 'View_1{Image_1{BackgroundImage: Image.png;Position: 0, 0;Width: 320;Height: 480;}Button_1{BackgroundImage: ButtonTop.png;Position: 61, 83;Width: 217;Height: 58;}Button_2{BackgroundImage: ButtonBottom.png;Position: 21, 303;Width: 217;Height: 58;}}'
4

2 回答 2

1

根据您的正则表达式,它正在寻找:左花括号前面的冒号{,这在您的字符串中不存在。尝试将字符串的开头更改为:

str = 'View:{Image...';

更新:我不确定i变量中包含什么 - 它总是一个空对象吗?但是,如果您继续增加数字,此替换功能可能对您更有效(演示):

str = str.replace(/([a-zA-Z]+_?)(\d+)?:{/g, function (m, n, d) {
  d = (parseInt(d,10) || 0) + 1; // add one
  if (!/_$/.test(n)) { n += '_'; } // add _ if name doesn't have it
  return n + d + ":{";
});
于 2013-01-06T18:03:03.693 回答
1

一些小的但关键的变化应该让它发挥作用。

首先,我认为您的str. 例如,您已经Button_2接近尾声,str但我假设您只是希望它成为Button并且您的replace函数负责递增。否则,结果将是Button_2_1......所以我假设你想要str这样:

str = 'View{Image{BackgroundImage: Image.png;Position: 0, 0;Width: 320;Height: 480;}Button{BackgroundImage: ButtonTop.png;Position: 61, 83;Width: 217;Height: 58;}Button{BackgroundImage: ButtonBottom.png;Position: 21, 303;Width: 217;Height: 58;}}'

如果是这样,那么这里是更正的代码(我希望它对你有用),后面有解释:

var i = {};

str = str.replace(/(\w+){/g, function (m, p1) {
    i[p1] = (i[p1] || 0) + 1;
    return p1 + "_" + i[p1].toString() + ":{";
});

在括号中的原始代码\S中,但这太笼统了,因为它甚至会捕获开始的花括号{。在正则表达式中,大写\S字母表示任何不是空格的字符。小写字母\w会找到字母数字字符,因此这可能是您想要捕获单词View, 和Image等的内容。因此,现在字符串的任何字母数字部分直接后跟(无空格)后跟大括号将被替换为下划线和数字,随着该项目的每个实例而递增。

我不确定你是否真的希望冒号:出现在每个数字之后,所以我把它留在了但如果你真的不想要它,只需将 return 语句替换为return p1 + "_" + i[p1].toString() + "{";

否则,如果您对上面的内容(包括冒号)感到满意,这就是结果字符串:

View_1:{Image_1:{BackgroundImage: Image.png;Position: 0, 0;Width: 320;Height: 480;}Button_1:{BackgroundImage: ButtonTop.png;Position: 61, 83;Width: 217;Height: 58;}Button_2:{BackgroundImage: ButtonBottom.png;Position: 21, 303;Width: 217;Height: 58;}}

我认为这就是你想要的。我已经设置了一个小提琴,这样你就可以看到正确的代码玩一玩。

希望这可以帮助。

于 2013-01-06T18:23:12.467 回答