Safari中不支持Regex lookhind-如何实现相同?

wixjitnu  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在使用以下regext (?<=")[^"]+(?=")|\w{3,}/g。但是我注意到它在Safari中不起作用:https://caniuse.com/js-regexp-lookbehind
我如何才能实现同样的工作在Safari以及?我正在寻找一个正则表达式或香草JS解决方案。
它需要实现的目标:
如果输入:xyz I am in the United States,输出应为:

["xyz", "the", "United", "States"]

如果输入xyz I am "in the United States"输出。应该是:

["xyz", "in the United States"]

因此,它应该丢弃所有的话:

  • 少于2个字符且不在双引号内
  • 如果1或2个字符的单词在双引号内,则不应丢弃它们

总之,相同的功能,把字符串到数组中,但与Safari太...
请帮帮忙

tf7tbtn2

tf7tbtn21#

使用捕获组:

function words(s) {
    var regex = /"([^"]+)"|(\w{3,})/g;
    var result = [];
    while (true) {
        var match = regex.exec(s);
        if (!match) break;
        result.push(match[match[1] ? 1 : 2]);
    }
    return result;
}
console.log(words('xyz I am in the United States'));
console.log(words('xyz I am "in the United States"'));

上面的解决方案可以用.matchAll和解构更容易地完成,但是我想我不应该冒险使用新的特性,因为你不支持向后看。
或者,您可以使用replace,但实际上放弃了它的主要效果,只使用副作用:

function words(s) {
    var result = [];
    s.replace(/"([^"]+)"|(\w{3,})/g, (_, quoted, word) => 
        result.push(quoted || word)
    );
    return result;
}
console.log(words('xyz I am in the United States'));
console.log(words('xyz I am "in the United States"'));
v6ylcynt

v6ylcynt2#

我今天在Safari上遇到了这个regexlookbehind问题,并(最终)提出了一个解决方案:

  • split()
  • replace() / replaceAll()

下面的工作示例(使用相同的方法)是一种解决问题的方法,在2022年6月,Safari(尚未)理解regexlookbehinds

示例:

const logOutput = (input) => {

  let quotedSection = (input.includes('"')) ? input.split('"')[1].split('"')[0] : '';
  let quotedSectionReplacement = quotedSection.replaceAll(' ', '^^');
  let inputString = input.replace(`"${quotedSection}"`, quotedSectionReplacement);

  let inputArray = inputString.split(' ');
  let outputArray = [];
  
  for (let i = 0; i < inputArray.length; i++) {
  
    if (inputArray[i].length > 2) {
    
      outputArray.push(inputArray[i].replaceAll('^^', ' '));
    }
  }
  
  console.log(outputArray);
}

logOutput( 'xyz I am in the United States');
logOutput('xyz I am "in the United States"');

相关问题