替换“[aA09.b]。”在JavaScript中使用“[aA09.b] \ n”

时间:2013-08-13 13:01:41

标签: javascript jquery regex

我有这个字符串:

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"

我认为快速正则表达可能有所帮助,但我不知道从哪里开始。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

假设括号不包含更多括号,您可以使用replace with a callback

var s = inputString.replace(/(\[[^\]]*\])|(\.)/g,
                        function(g0,brackets,dot){ return brackets || '\n';}
                        );

正则表达式捕获括号(\[[^\]]*\]),因此可以在捕获时用于替换,并在捕获\n时使用\.。 从本质上讲,这是“跳过”括号内的点。

答案 1 :(得分:1)

Kobi的单一正则表达式替换解决方案简洁,快速,准确和优雅。它正确处理具有非嵌套括号结构的字符串。

JavaScript解决方案[针对[嵌套]括号]

要使用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, "&");
}