【问题标题】:javascript regex to match everything between two strings (without newline) [duplicate]javascript正则表达式匹配两个字符串之间的所有内容(没有换行符)[重复]
【发布时间】:2021-05-12 17:25:00
【问题描述】:

我正在尝试匹配两个标签之间的所有文本(包括特殊字符和标记标签),但是,当同一行上有两个匹配项时,正则表达式认为是一个匹配项。

我用这个表达停止了:

(?<=<br><i>)[^<\/i>].*(?=<\/i><br>)

开始标签:

<br><i>

结束标记:

</i><br>

它适用于包含以下内容的 html:

<br><i>"hello olá - ok@tchau"</i><br>  
<br><i>"another text"</i><br>

但是使用这个 html 它不起作用:

<br><i>"hello"</i><br><br><i>"ok"</i><br>

https://regex101.com/r/kHd2z2/1

【问题讨论】:

  • @Nick,不,我搜索了很多,这个问题和许多其他问题都不适用于我的情况
  • 看来该问题的第二个答案正是您接受的解决方案......
  • @Nick,你是对的

标签: javascript regex


【解决方案1】:

(?&lt;=&lt;br&gt;&lt;i&gt;)[^&lt;\/i&gt;](.*?)(?=&lt;\/i&gt;&lt;br&gt;)

具体来说,请注意(.*?),它使星号lazy rather than greedy 仅以尽可能短的方式匹配标签内的内容。

请看这里:https://regex101.com/r/QKl0uN/1

【讨论】:

    【解决方案2】:

    为什么你不应该使用正则表达式来解析 html/xml

    一般来说,将正则表达式用于htmlxml 解析之类的东西并不是一个好主意。最好只编写一个以某种方式模拟“真实解析”的脚本(例如,您使用内置函数来解析字符串的某些部分),这在大多数情况下就足够了,或者使用“真实解析”就像遍历所有一个个字符。

    正则表达式更难更改和扩展,因为它通常是一个非常具体且紧凑的用例,而且通常更难理解。

    此外,正则表达式的性能很差。如果您经常使用此代码,我建议您编写一个简单的脚本来完成这项工作。 JavaScript 有一些 indexOflastIndexOf 方法可以帮助很多。

    替代解决方案

    以下内容如何:

    function matchBetween(openDelimiter, closeDelimiter, input, stripArray = []) {
      const from = input.indexOf(openDelimiter);
      let result = '';
      if (from !== -1) {
        const to = input.lastIndexOf(closeDelimiter);
        if (to !== -1) {
          result = input.substring(from + openDelimiter.length, to);
          for (let i = 0; i < stripArray.length; i++) {
            result = result.replaceAll(stripArray[i], '');
          }
        }
      }
      return result;
    }
    
    const examples = [
      '<br><i>"hello olá - ok@tchau"</i><br>',
      '<br><i>"another text"</i><br>',
      '<br><i>"hello"</i><br><br><i>"ok"</i><br>'
    ];
    
    const openDelimiter = '<br><i>';
    const closeDelimiter = '</i><br>';
    const stripArray = [openDelimiter, closeDelimiter];
    
    for (let i = 0; i < examples.length; i++) {
      console.log('#' + i, matchBetween(openDelimiter, closeDelimiter, examples[i], stripArray));
    }

    这只是一个非常简单的例子,但大多数时候这样的功能已经足够了。您还可以随时轻松扩展功能。

    【讨论】:

    • 谢谢,我开始学习正则表达式,我认为正则表达式在这种情况下很有用,真的,正则表达式不适合那个工作,我已经做了一个函数,我会再次使用它。
    • @danilo 是的。好吧,它适用于简单的小示例,但您不想在 (x)html 之类的上下文无关语言中使用它。最大的问题是你有大量的用例需要考虑——它们可以很容易地破坏代码——如果你想在正则表达式中捕获所有的异常和东西,你就完蛋了。 (进一步阅读:stackoverflow.com/questions/590747/…medium.com/thecyberfibre/…
    猜你喜欢
    • 2023-02-04
    • 2011-08-31
    • 1970-01-01
    • 2013-05-26
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多