正则表达式匹配行尾,除非它以右括号结束

Regex Match End of Line Unless it Ends with a Closed Bracket

我正在尝试编写一个 JavaScript 正则表达式,它将抓住一行的结尾,除非该行以右括号结尾,例如:

[word]
lengthy text line

[other word]
even lengthier text line! Whoo!

我写下这个 Regex 的那部分 new RegExp(/[\n]\n|(?![^\]])$/gm)

但我还需要能够抓住行尾,即使没有双 space,这被证明是非常困难的,因为我真的不知道很多关于正则表达式。

                                        --   [word]
These two lines need to be grouped      --   lengthy text line

                                        --   [other word]
These two lines need to be grouped      --   even lengthier text line! Whoo!
This needs to be it's own group         --   This text line is the longest of them all!
                                        --   [more words]
These two lines need to be grouped      --   The last guy can win...

令人恼火的是,有一个非常简单的 Regex 可以实现这个目标,但 FireFox 目前不支持它,这是一个问题。 (?<!])\n 断言背后的负面看法

编辑:用于信息的方法是拆分,它将放置在文本区域中的值拆分并与array[i].match(/^\[(.*?)\]\n/)匹配。它看起来像这样:

var regex = new RegExp(/[\n]\n|(?![^\]])$/gm);
var array = $('#textar').val().split(regex);

for (var i = 0; i < array.length; i++) {
    var match = array[i].match(/^\[(.*?)\]\n/)
}

但是有更多的代码获取并使用这些变量。

解决方案: Wiktor Stribiżew 找到了解决方案。将 .split(regex) 更改为 .match(regex) 并添加它们的正则表达式解决了问题

var regex = new RegExp(/^.*[^\]\n](?:\]\n.*[^\]\n])*$/gm);
var array = $('#textar').val().match(regex);

for (var i = 0; i < array.length; i++) {
    var match = array[i].match(/^\[(.*?)\]\n/)
}

您正在寻找这样的正则表达式:

/^\[.+(\n+[^\[]+)/gm
  • ^在字符串开头,
  • 寻找[
  • .+ 后跟任何字符
  • (\n+[^\[]+) 输入任意次数或任何字符,只要它不是 [

演示:https://regex101.com/r/c1giqu/3

为方便起见,完整匹配将文本保留在括号内。第一组仅包含没有括号的文本。

您可以使用 String#match:

text.match(/^.*[^\]\n](?:\]\n.*[^\]\n])*$/gm)

正则表达式详细信息

  • ^ - 行首
  • .*[^\]\n] - 除换行符外的 0 个或更多字符,尽可能多,然后是换行符和 ]
  • 以外的字符
  • (?:\]\n.*[^\]\n])* - 0 次或多次重复
    • \]\n - ] 和一个换行符、LF、char
    • .*[^\]\n] - 除换行符外的 0 个或更多字符,尽可能多,然后是换行符和 ]
    • 以外的字符
  • $ - 一行结束。

查看 JS 演示:

var text = "[word]\nlengthy text line\n\n[other word]\neven lengthier text line! Whoo!\nThis text is the longest of them all!\n[more words]\nThe last gyu can win...";
console.log(text.match(/^.*[^\]\n](?:\]\n.*[^\]\n])*$/gm));