RegEx将文本与分隔符的第一次出现相匹配

时间:2015-02-17 23:56:34

标签: javascript regex

这是我想要与RegEx匹配的数据:

<table>
  <tr>
    <td>
      <font size="4">Speciality</font>
    </td>
    <td>
      <font size="4">somespeciality</font>
    </td>
  </tr>
  <tr>
    <td>
      <font size="4">Date</font>
    </td>
    <td>
      <font size="4">somedate</font>
    </td>
  </tr>
</table>

我希望得到结果somespeciality但是使用此RexEx:

/Speciality[\s\S]*size="4">(.*?)<\/font>/i

我得到了somedate。这样做的正确方法是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

您需要在角色等级后使用 - greedy量词。

[\s\S]*?

答案 1 :(得分:1)

只是为了记录,如果您确实想要使用纯DOM方法执行此操作,您将执行以下操作。它获取所有元素,找到第一个文本内容与文本匹配,获取它的标记名,然后找到具有该标记名称的下一个元素并返回文本内容:

var data = '<table><tr><td><font size="4">Speciality</font></td>' +
           '<td><font size="4">somespeciality</font></td></tr>' +
           '<tr><td><font size="4">Date</font></td><td><font size="4">' +
           'somedate</font></td></tr></table>';

function getSpecial(text, data) {
  var div = document.createElement('div');
  div.innerHTML = data;
  var tagName;

  var nodes = div.getElementsByTagName('*');

  for (var i=0, iLen=nodes.length; i<iLen; i++) {
    if (tagName && nodes[i].tagName == tagName) {
      return nodes[i].textContent;
    }

    if (nodes[i].textContent.trim() == text) {
      tagName = nodes[i].tagName;
    }
  }
}

console.log(getSpecial('Speciality', data)); // somespeciality

任何此类方法(包括使用正则表达式)的困难在于对标记(以及生成的DOM)的任何更改都可能导致进程失败。

请注意,上述内容需要ES5并支持 textContent ,它应该是所有现代浏览器和IE 9+。通过为 trim 添加polyfill并使用nodes[i].textContent || nodes[i].innerText,可以添加对旧版浏览器的支持。其余的都没事。