-1

我有这个字符串:

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"

我认为快速的正则表达式可能会有所帮助,但我不确定从哪里开始。有任何想法吗?

4

2 回答 2

3

假设括号不包含更多括号,您可以使用replace回调

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

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

于 2013-08-13T13:12:29.240 回答
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, "&");
}
于 2013-08-14T02:32:06.410 回答