我有这个字符串:
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"
我认为快速正则表达可能有所帮助,但我不知道从哪里开始。有什么想法吗?
答案 0 :(得分:3)
假设括号不包含更多括号,您可以使用replace
with a callback:
var s = inputString.replace(/(\[[^\]]*\])|(\.)/g,
function(g0,brackets,dot){ return brackets || '\n';}
);
正则表达式捕获括号(\[[^\]]*\])
,因此可以在捕获时用于替换,并在捕获\n
时使用\.
。
从本质上讲,这是“跳过”括号内的点。
答案 1 :(得分:1)
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, "&");
}