【问题标题】:Javascript String MatchingJavascript字符串匹配
【发布时间】:2012-05-25 01:58:40
【问题描述】:

这是我目前得到的:

var source = '>R$11111</b>';
var price = source.match(/[^R$]\d+/);

'source' 有点像 innerHTML 插入,但我已经记下来了。

问题是“价格”必须介于 'R$''&lt;/b&gt;' 之间,无论它们之间是什么,从 1 到无穷大。我在那里的东西会起作用,但是当我从中取出 'R$''&lt;/b&gt;' 时,它仍然会找到值和一个额外的字符。

所以基本上我只需要帮助来制作它,所以它只会在 'R$''&lt;/b&gt;' 都存在时获取值。

***OR 从 R$ 到字符串的末尾。但 R$ 和价格之间没有空格。

【问题讨论】:

  • @MarkReed &lt;/b&gt; 我认为
  • 当你说“innerHTML”时,你并不是说它来自在 DOM 元素上使用 .innerHTML,是吗?如果是这样,最好深入到适当的元素,只处理文本内容。

标签: javascript regex string-matching


【解决方案1】:

嗯,[^R$] 匹配“恰好一个既不是 R 也不是 $ 的字符”,所以这可能不是您想要的。

var price = source.match(/R\$(\d+)/)[1];

或者如果价格可能不是全数字:

var price = source.match(/R\$(.*?)<\/b>/)[1];

重要的是您关心的部分周围的括号,这会导致任何与括号之间的内容匹配的文本作为数组的第二个元素包含在匹配的返回值中(第一个是匹配整个正则表达式的文本)。

如果字符串可能与正则表达式不匹配,那么最好分两步完成:

var match = source.match(/whichever/);
if (match) {
    price = match[1]; 
} else {
    console.log("no price found.");
}

【讨论】:

  • 我认为第一种方法(白名单)比第二种方法(黑名单)要好,即使价格不是全数字。只需调整允许的字符。例如source.match(/R\$([\d.]+)/)[1]
【解决方案2】:
var source = '>R$11111</b>';
var price = source.match(/R\$(\d+)<\/b>/);

if (price)
    console.log(price[1]); // 11111

【讨论】:

    【解决方案3】:

    如果有人感兴趣,这是一个非正则表达式的解决方案:

    function getPrice(str, start, end){
        var first = str.indexOf(start),
            last = str.lastIndexOf(end);
    
        return ~first ?
                    str.slice(first + start.length, (~last ? last : str.length))
                        .replace(/^\s+/, "")
                :
                    str;
    }
    
    var source = "...R$  21112</b>...";
    
    console.log(getPrice(source, "R$", "</b>")); //"21112"
    console.log(getPrice(source, "R$", "nomatch")); //"21112</b>..."
    console.log(getPrice(source, "nomatch", "</b>")); //"...R$  21112</b>..."
    

    Demo

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多