【问题标题】:Find string that starts with two digits and a letter查找以两位数字和一个字母开头的字符串
【发布时间】:2019-06-29 23:13:17
【问题描述】:

我正在编写一个 JavaScript 代码来隐藏网站上不以特定文本开头的元素。

网站上有很多组合可以输出<span>。它们都以 2 个数字开头,然后是一个字母。例如:

76T
92Q
18H
71S

有时字符串在行尾也包含文本。 但现在我试图找出哪些行包含 2 个数字(不管是哪个),然后是字母“F”。比如92F、35F、19F等等。

我正在尝试使用 javascript .Match 但我没有得到任何结果。它说不存在这样的功能。

我的代码:

var descriptions = document.getElementsByClassName('myClass');
var reg = new RegExp("^([0-9])F(.*)");

for (var i=0; i<descriptions.length; i++) {
    if (descriptions[i].match(reg)) {
        console.log('it exists!');
    }
}

基本上我只想要所有以数字 (0-9) 和字母 F 开头的字符串。它们之间没有空格。

网站上的输出如下所示:

<span class="myClass">36P Wooden</span>

编辑:

隐藏/删除不包含此文本的 div。

var descriptions = document.getElementsByClassName('myClass');
var reg = /^\d{2}F/;

for (var i=0; i<descriptions.length; i++) {
    if (!descriptions[i].textContent.match(reg)) {
        descriptions[i].closest('myClass2').style.display = 'none';
    }
}

【问题讨论】:

    标签: javascript regex string match


    【解决方案1】:

    getElementsByClassName 返回一个类似数组的元素 集合,元素没有.match 方法。检查每个元素的textContent,并考虑使用regex literals instead of new RegExp

    var descriptions = document.getElementsByClassName('myClass');
    var reg = /^\d{2}F/;
    
    for (var i=0; i<descriptions.length; i++) {
        if (descriptions[i].textContent.match(reg)) {
            console.log('it exists!');
        }
    }
    

    var descriptions = document.getElementsByClassName('myClass');
    var reg = /^\d{2}F/;
    
    for (var i=0; i<descriptions.length; i++) {
        if (descriptions[i].textContent.match(reg)) {
            console.log('it exists!', descriptions[i]);
        }
    }
    <span class="myClass">36P Wooden</span>
    <span class="myClass">11F something</span>

    如果您想要一个与模式匹配的元素集合,请改用.filter

    var descriptions = document.getElementsByClassName('myClass');
    var reg = /^\d{2}F/;
    
    const matchingElements = [...document.querySelectorAll('.myClass')]
      .filter(elm => elm.textContent.match(reg));
    console.log(matchingElements);
    <span class="myClass">36P Wooden</span>
    <span class="myClass">11F something</span>
    <span class="myClass">22F something else</span>

    或者,如果您需要所有匹配的字符串,请先使用Array.from 将每个元素映射到其textContent,然后再使用filtering:

    var descriptions = document.getElementsByClassName('myClass');
    var reg = /^\d{2}F/;
    
    const matchingStrings = Array.from(
      document.querySelectorAll('.myClass'),
      elm => elm.textContent
    )
      .filter(textContent => textContent.match(reg));
    console.log(matchingStrings);
    <span class="myClass">36P Wooden</span>
    <span class="myClass">11F something</span>
    <span class="myClass">22F something else</span>

    要查找不匹配元素的每个父元素,请检查父元素的.every 之一是否不匹配:

    const parentsWithNoMatches = [...document.querySelectorAll('.myClass2')]
      .filter(parent =>
        [...parent.querySelectorAll('.myClass')]
          .every(child => !child.textContent.match(reg))
      );
    

    【讨论】:

    • 太棒了!谢谢!由于我只想显示匹配 2 位数字和 F 的那些,有什么方法可以隐藏页面上的所有其他对象?这必须对父类进行。因为大约有 6 个 div,然后在第 6 个 div 里面有这个字符串。我必须在代码中返回 6 个步骤,并在字符串之前删除所有嵌套的 div。知道怎么做吗?编辑:我不能使用 jquery 来隐藏它。
    • 听起来你需要反转测试 - 检查匹配是否失败,而不是匹配是否成功。很难说没有看到他们的代码如何处理父元素
    • 我必须删除/隐藏整个 div,类“myClass2”是这个字符串的父级。所以最接近的“myClass2”(上图)应该被隐藏。
    • 我在这里使用当前代码编辑了我的第一篇文章。收到错误:Uncaught TypeError: Cannot read property 'style' of null at &lt;anonymous&gt;:6:53
    • 听起来myClass 元素之一没有myClass2 父元素。而是迭代父母
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2021-11-30
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多