我有这个字符串:
var inputString = "Some text [ some text here . some more text] . some sentence."
.
应该替换为,前提\n
是它不在两者之间[ ]
。
预期结果:
"Some text [ some text here . some more text] \n some sentence\n"
我认为快速的正则表达式可能会有所帮助,但我不确定从哪里开始。有任何想法吗?
我有这个字符串:
var inputString = "Some text [ some text here . some more text] . some sentence."
.
应该替换为,前提\n
是它不在两者之间[ ]
。
预期结果:
"Some text [ some text here . some more text] \n some sentence\n"
我认为快速的正则表达式可能会有所帮助,但我不确定从哪里开始。有任何想法吗?
假设括号不包含更多括号,您可以使用replace
回调:
var s = inputString.replace(/(\[[^\]]*\])|(\.)/g,
function(g0,brackets,dot){ return brackets || '\n';}
);
正则表达式捕获括号(\[[^\]]*\])
,因此它可以在捕获时用于替换,并在捕获\n
时使用\.
。
本质上,这是“跳过”括号内的点。
Kobi 的单一正则表达式替换解决方案简短、简单、快速、准确和优雅。它正确处理具有非嵌套括号结构的字符串。
要使用 JavaScript 正确处理嵌套括号,需要更复杂的迭代解决方案。由于 JavaScript 正则表达式语法不提供递归表达式,因此当括号嵌套时,不可能匹配最外面的一对匹配括号。然而,编写一个正确匹配最里面的一对匹配括号的正则表达式是很容易的:
/\[([^[\]]*)\]/g
下面测试的 JavaScript 函数通过从内到外迭代匹配最里面的括号,“隐藏”括号和点字符来处理嵌套结构。(方括号和点字符暂时替换为其等效的 HTML 实体。)一旦(可能嵌套的)括号文本中的所有点都被“隐藏”,字符串中的所有剩余点(位于括号之外) , 替换为换行符。完成后,所有暂时隐藏的角色都将恢复。由于此函数在内部将 HTML 实体用作临时占位符,因此原始字符串中的任何预先存在的 HTML 实体都会在开始时保留,然后在结束时恢复。
function replaceDotsNotInBrackets(text) {
// Regex to match innermost brackets capturing contents in $1.
var re_inner_brackets = /\[([^[\]]*)\]/g;
// Firstly, hide/protect any/all existing html entities.
text = text.replace(/&/g, "&");
// Iteratively "Hide" dots within brackets from inside out.
// Hide dots and brackets by converting to decimal entities:
// Change [ to [
// Change ] to ]
// Change . to .
while (text.search(re_inner_brackets) !== -1) {
text = text.replace(re_inner_brackets,
function(m0, m1){
return "["+ m1.replace(/\./g, ".") +"]";
});
} // All matching brackets and contained dots are now "hidden".
// Replace all dots outside of brackets with a linefeed.
text = text.replace(/\./g, "\n");
// Unhide all previously hidden brackets and dots.
text = text.replace(/&#(?:91|46|93);/g,
function(m0){
return {"[": "[", ".": ".", "]": "]"}[m0];
});
// Lastly, restore previously existing html entities.
return text.replace(/&/g, "&");
}