正则表达式 - 用换行符替换第三个点和空格

时间:2017-11-22 13:41:03

标签: javascript regex

我在下面有一个正则表达式可以正常工作。它的作用是寻找每一个第三个"。#34;并插入一个断行...

some_string.replace(/((?:\.[^\.]*){2})\./g, '$1\.<br/><br/>')

所以这个文字:

some test. some other test. other 2 test. test nice text.

变为:

some test. some other test. other 2 test.  
test nice text.

我需要更改它以寻找点和空格。换句话说,目前:

some test. some other test. other 2.3 test. test nice text.

看起来像:

some test. some other test. other 2.
3 test. test nice text.

我需要这个文字看起来像这样:

some test. some other test. other 2.3 test. 
test nice text.

5 个答案:

答案 0 :(得分:1)

您可以在javascript中使用.replace的一个鲜为人知的功能,而不是过度复杂的RegEx。

它的第二个参数也可以是一个函数,而不是一个字符串。 有关此外观的完整文档,请访问: Funtion as second parameter to replace

有关您问题的工作示例,请尝试以下操作:

let i = 0
some_string.replace(/\. /g, () => {
    return i++ == 2 ? '. <br /><br />' : '. '
})

如果您不熟悉箭头功能(() => {}),可以read about them here
或者如果你不知道a ? b : c的含义,它就是ternary operator

如您在本演示中所见,它可以完美地完成您给出的示例:

&#13;
&#13;
const break_lines = (some_string) => {
  let i = 0
  return some_string.replace(/\. /g, () => {
    return i++ == 2 ? '. <br />' : '. '
  })
}

const texts = [
  'some test. some other test. other 2 test. test nice text.',
  'some test. some other test. other 2.3 test. test nice text.'
]

for (const text of texts) {
  document.body.innerHTML += `${text}<br /> --> <br />${break_lines(text)}<br /><br />`
}
&#13;
body {
  font-family: Consolas;
}
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我会做这样的事情:

replace(/(([^.]|\.(?! ))*\. ){3}/g, '$&<br/><br/>')

解释

/([^.]|\.(?! ))*\. /

匹配 .字符(/[^.]/)或.字符后跟空格({ {1}})。它会继续匹配(/\.(?! )/),直到遇到/*/后跟空格(在这种情况下,./[^.]/都不匹配,从而继续{{1 }})。

我使用负面预测/\.(?! )/的原因是因为我想逐个字符地评估这个字符。如果我用/\. /替换它,那么它也会匹配“not a space”字符。这意味着,如果我以两个点/(?! )/结束一行,则匹配/[^ ]/,因为第二个点包含在Test sentence.. Test 2.中,因此已经通过

Test sentence..<space>确保该组匹配3次。

/\.[^ ]/将自己替换整个匹配,然后是2个换行符。

注意

我正在使用捕获组,尽管我没有使用它们。如果您想使用非捕获组,则可以使用非捕获组安全地替换所有捕获组。

修改

有关更具可读性的解决方案,请参阅ctwheels answer。这完全相同,但使用了懒惰的解决方案。请记住,在大文本上使用时,懒惰的正则表达式通常会慢一点(我没有测试过两者的速度)。但如果可读性更重要,我会选择他的解决方案。

答案 2 :(得分:1)

出于查看目的,我使用了$1\n的替代品。实际上,您可以将其更改为$1<br/><br/>$&<br/><br/>并进行修改。

代码

原始

See regex in use here

((?:.*?\. ){2}.*?)\. 

注意:上面的模式末尾有一个空格。

修改

感谢Johan Wentholt进行下面的编辑。

(.*?\. ){3}

替换

$&\n

用法

var s = [
  "some test. some other test. other 2 test. test nice text.",
  "some test. some other test. other 2.3 test. test nice text."
];

s.forEach(function(e) {
  var x = e.replace(/(.*?\. ){3}/g, "$&\n");
  console.log(x);
});

说明

  • ((?:.*?\. ){2}.*?)将以下内容捕获到捕获组1中
    • (?:.*?\. ){2}完全匹配以下两次
      • .*?任意次数匹配任何字符,但尽可能少
      • \.按字面匹配点字符.,然后按空格字符字面匹配
    • .*?任意次数匹配任何字符,但尽可能少
  • \.按字面匹配点字符.,然后按空格字符字面匹配

答案 3 :(得分:0)

所有这些都是针对点和空格的,我保留我的片段以防万一:

/^(\s{0,1}\.{0,1}[a-zA-Z]+)+$/.test('space ..hello space')
false
/^(\s{0,1}\.{0,1}[a-zA-Z]+)+$/.test('space .hello space')
true
v2:

/^(\s?\.?[a-zA-Z]+)+$/.test('space .hello space')
true
/^(\s?\.?[a-zA-Z]+)+$/.test('space ..hello space')
false
v3: if you need some thisn like one space or dot between

/^([\s\.]?[a-zA-Z]+)+$/.test('space hello space')
true
/^([\s\.]?[a-zA-Z]+)+$/.test('space.hello space')
true
/^([\s\.]?[a-zA-Z]+)+$/.test('space .hello space')
false
v4:

/^([ \.]?[a-zA-Z]+)+$/.test('space hello space')
true
/^([ \.]?[a-zA-Z]+)+$/.test('space.hello space')
true
/^([ \.]?[a-zA-Z]+)+$/.test('space .hello space')
false
/^([ ]?\.?[a-zA-Z]+)+$/.test('space .hello space')
true

如果您想使用正则表达式对其进行测试,我建议使用Rubular

答案 4 :(得分:0)

你不能只添加\ s吗?像这样:

(/((?:\.[^\.]*){2})\.\s/g, '$1\.<br/><br/>')