【问题标题】:Count regular expression matches in jQuery计算 jQuery 中的正则表达式匹配
【发布时间】:2011-03-13 04:05:39
【问题描述】:

我需要在使用 load() 函数加载的动态加载的<div> 中计算一组正则表达式。我还需要将此<div> 调整为其中最长的字符行。有没有办法做到这一点?我试过四处寻找,找不到任何东西,甚至在 SO 上也找不到。我应该提到我正在测试的表达式是:

Sat Mar 12 12:45:38 PST 2011

使用这个正则表达式:

if ($('#result').text().match(/[A-Za-z]{3}\s[A-Za-z]{3}\s[0-9]{1,2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\s[A-Z]{3}\s[0-9]{4}/))

【问题讨论】:

标签: javascript jquery html css


【解决方案1】:
var str="The rain in SPAIN stays mainly in the plain"; 
var patt1=/ain/gi;  //noticed the g.  g will enable match of all occurance, and without it it'll only match the first occurance
console.log(str.match(patt1).length);  //4 matched

JavaScript 匹配正则表达式函数返回一个数组,因此您基本上可以对该数组进行长度计算并获取匹配元素的大小。确保您在 RegEx 中使用 g 来搜索所有出现的情况

根据您的 RegEx,您可以执行以下操作:

$('#result').text().match(/[A-Za-z]{3}\s[A-Za-z]{3}\s[0-9]{1,2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\s[A-Z]{3}\s[0-9]{4}/g).length //this should give you the total count of occurance

【讨论】:

  • 谢谢,您知道如何动态调整<div> 的大小吗?另外,我需要获取两个匹配项之间的内容。解决此问题的最佳方法是什么?
  • @malfy 你可以使用javascript来设置div的宽度和高度。您是否试图获取标签之间的内容?像这样的东西? stackoverflow.com/questions/1586779/…
  • 我只想将<div> 调整为最大字符串的宽度。而且我也不想用 PHP 做这个,我需要知道 Javascript 的函数和方法。
  • 如果没有匹配就会给JS异常吧?
【解决方案2】:

kjy112 给了你答案。就像澄清的答案一样,这不是真正的 jQuery,而是 Javascript RegEx(所以也许这会让你的搜索失败)。

如果那个正则表达式结果很慢——如果你返回许多日期可能会出现这种情况——你可以只计算一些独特的组件,比如年份:

$('#result').text().match(/\d{4}/).length

【讨论】:

    【解决方案3】:

    马尔菲,

    想到了 3 种获取字符串宽度的方法。我会先介绍这些,然后是如何获得最长的长度。看起来其他人已经解决了这个正则表达式。

    1) (fastest)
    

    如果只有文本本身需要一定宽度,而不是 div,那么您可以使用 white-space:nowrap 来确保文本保持全宽。

    $('div.someClass').css('whiteSpace','nowrap');
    
    
    
    
    2) (slowest)
    

    如果您需要一个字符串的像素宽度来设置另一个 div 的宽度,一种方法是创建一个包含该字符串的元素并使用上面的 css 属性。示例:

    var yourString = 'your string';
    // create a div containing your string
    var $tempDiv = jQuery('<div style="visibility:hidden;position:absolute;white-space:nowrap">'+jQuery.trim(yourString)+'</div>').appendTo('body');
    $newDiv = <your new div, however you're creating it>;
    // set the width of the new div to the width of the temp div
    $newDiv.width($tempDiv.width());
    // and clean up;
    $tempDiv.remove();
    //repeat as necessary
    
    
    
    
    3) (quite fast too)
    

    或者,如果您确定要使用等宽字体(courier、consolas 等)。有一个更快的方法。保存单个字符的宽度并将其乘以每个新文本字符串的长度。这样你就不会每次都写一个新元素。例如:

    var $tempDiv = $('<div style="visibility:hidden;margin:0;padding:0;border:0;">z</div>').appendTo('body');
    //(any character will work. z is just for example); 
    var reusableCharacterWidth=$tempDiv.width();
    $tempDiv.remove();
    
    var firstString = your string';
    // set the width of your first div
    $newDiv.width(reusableCharacterWidth*firstString.length);
    var nextString = 'your next string';
    // set the width of your next div
    $nextNewDiv.width(reusableCharacterWidth*nextString.length);
    

    (注意:您可能需要在字符串上使用 $.trim() 以防万一)

    获取最长的字符串:

    var longestLineLength,
        yourText= 'your text here';
    function getLongestLineLength(lines){
        var oneLineLength,
            longest=0,
            linesArray = lines.split('\n');
        for(var i=0,len=linesArray.length;i<len;i++){
            oneLineLength=linesArray[i].length;
            longest=oneLineLength>longest?oneLineLength:longest;
        }
      return longest;
    }
    longestLineLength = getLongestLineLength(yourText);
    

    干杯!

    亚当

    【讨论】:

    • 您的最终解决方案很好,但略有错误,我不得不修改您的代码,因为最长未定义并且一些变量名混淆了。另外,既然我有最长的字符行(对我来说很容易做到),真正的问题是如何将我的&lt;div&gt; 设置为那个长度? px 将无法正常工作,em、ex 或 pt 也不会。另外,我认为创建一个新的&lt;div&gt; 来填充旧的方法是一种不好的做法。
    • 你是对的。最后一个解决方案很时髦。这就是我在凌晨 1 点左右发布而没有先测试代码的结果。 ;) 我会在几秒钟内修复它。
    • 关于“如何将我的 div 设置为那个长度?”.. 我不确定如何回答。如果您不使用 px 或 em、ex、pts,那么还剩下什么......也许是 %?你能举一个从用户的角度来看成功的例子吗?关于好的/坏的做法:我希望提供一个起点。在不常见的情况下,可行的解决方案通常对我来说已经足够好了。如果您知道更好的做法来改进这些,那就太好了!
    • 很简单。假设我们有一个字符串 aaaaaa,&lt;div&gt; 的轮廓应该是这样的:|aaaaaa|
    • Divs 是块元素,默认情况下占据 100% 的宽度,因为它们旨在分隔垂直页面部分。跨度是内联元素,可以自动调整大小,就像您正在寻找的那样。如果你想让 div 这样做,你必须像我上面提到的那样手动设置它们的宽度。这可能会有所帮助:yourhtmlsource.com/stylesheets/cssspacing.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多