regex 通过前缀和后缀(可以重复)搜索字符串,无需回溯正则表达式

uttx8gqw  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(86)

我正在尝试为JS做一个正则表达式。下面是输入

blah    PREFIX hello SUFFIX blah
 blah   PREFIX PREFIX SUFFIX blah
  blah  PREFIX SUFFIX SUFFIX blah
blah    PREFIX var+2 SUFFIX blah

正则表达式应该返回序列的第一个组/索引

PREFIX hello SUFFIX
PREFIX PREFIX SUFFIX
PREFIX SUFFIX SUFFIX
PREFIX var+2 SUFFIX

注意:前缀和后缀是固定的。在这些单词之间,我们可以有任何数量的单词。
我想出了这个正则表达式

(PREFIX(?=(?<spaces>[\s\S]+SUFFIX))\k<spaces>)

但这一个被报告为polynomial
https://regex101.com/r/YCbU0f/1有攻击字符串,这会导致更多的回溯..我们可以从满足上述要求的工具中使其安全吗?

okxuctiv

okxuctiv1#

回溯速度慢,容易受到攻击字符串的攻击

你有没有考虑过一种更简单的方法,让你摆脱正则表达式的漏洞?你正在尝试做的是从根本上简单,所以适合基本操作,没有复杂的正则表达式?

const strings = `
PREFIX hello SUFFIX
PREFIX PREFIX SUFFIX
PREFIX SUFFIX SUFFIX
PREFIX var+2 SUFFIX

Note: PREFIX and SUFFIX are kind of fixed. in between these words, we can have any number. of words.`.split("\n")

const prefix = "PREFIX"
const suffix = "SUFFIX"

strings.forEach(s => {
  const first = s.indexOf(prefix);
  const last = s.lastIndexOf(suffix);
  if (first > -1 && last > -1 && last > first) {
    out = s.slice(first, last + suffix.length);
    console.log(out)
  }
})

相关问题