我在下面有一个正则表达式可以正常工作。它的作用是寻找每一个第三个"。#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.
答案 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。
如您在本演示中所见,它可以完美地完成您给出的示例:
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;
答案 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/>
并进行修改。
((?:.*?\. ){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/>')