用两个规则拆分和替换文本(正则表达式)

时间:2018-08-13 20:16:20

标签: javascript regex

我试图通过两个规则分割文本:

  1. 由空格分隔
  2. 将大于5个符号的单词分成两个单独的单词,例如({aaaaawww分为aaaaa-www

我创建了可以检测到此规则(https://regex101.com/r/fyskB3/2)的正则表达式,但不了解如何使这两个规则在(text.split(/REGEX/)中起作用

当前正则表达式-(([\s]+)|(\w{5})(?=\w))

例如,初始文本为hello i am markopollo,结果应类似于['hello', 'i', 'am', 'marko-', 'pollo']

4 个答案:

答案 0 :(得分:1)

使用.match可能会更容易:最多匹配5个非空格字符:

const str = 'wqerweirj ioqwejr qiwejrio jqoiwejr qwer qwer';
console.log(
  str.match(/[^ ]{1,5}/g)
)

答案 1 :(得分:1)

我的方法是在分割之前处理字符串(我是RegEx的忠实粉丝):

1-搜索all the 5 consecutive non-last characters并将其替换为\1-

模式(\w{5}\B)可以解决问题,\w{5}将匹配5个完全相同的字符,而\B将仅在最后一个字符不是单词的结尾字符时匹配。

2-用空格分隔字符串。

var text = "hello123467891234 i am markopollo";
var regex = /(\w{5}\B)/g;

var processedText = text.replace(regex, "$1- ");

var result = processedText.split(" ");

console.log(result)

希望有帮助!

答案 2 :(得分:0)

类似的事情应该起作用:

const str = "hello i am markopollo";
const words = str.split(/\s+/);
const CHUNK_SIZE=5;

const out = [];
for(const word of words) {
  if(word.length > CHUNK_SIZE) {
      let chunks = chunkSubstr(word,CHUNK_SIZE);
      let last = chunks.pop();
      out.push(...chunks.map(c => c + '-'),last);
  } else {
      out.push(word);
  }
}
console.log(out);

// credit: https://stackoverflow.com/a/29202760/65387
function chunkSubstr(str, size) {
  const numChunks = Math.ceil(str.length / size)
  const chunks = new Array(numChunks)

  for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
    chunks[i] = str.substr(o, size)
  }

  return chunks
}

,即,首先将字符串分成空格中的单词,然后找到长度超过5个字符的单词并将其“块化”。我弹出最后一个块,以避免在其中添加-,但是如果您修补chunkSubstr,则可能会有更有效的方法。

regex.split不能很好地工作,因为它将基本上从输出中删除那些项目。在您的情况下,您似乎要删除空格,但要保留字,因此将两个字分割都不会起作用。

答案 3 :(得分:0)

使用@CertainPerformance = [^\s]{1,5}的正则表达式,然后应用regex.exec,最后循环所有匹配以达到目标。

就像下面的演示一样:

const str = 'wqerweirj ioqwejr qiwejrio jqoiwejr qwer qwer'
let regex1 = RegExp('[^ ]{1,5}', 'g')

function customSplit(targetString, regexExpress) {
  let result = []
  let matchItem = null
  while ((matchItem = regexExpress.exec(targetString)) !== null) {
    result.push(
      matchItem[0] + ( 
        matchItem[0].length === 5 && targetString[regexExpress.lastIndex] && targetString[regexExpress.lastIndex] !== ' '
         ? '-' : '')
    )
  }
  return result
}
console.log(customSplit(str, regex1))
console.log(customSplit('hello i am markopollo', regex1))