正则表达式匹配行尾,除非它以右括号结束
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));
我正在尝试编写一个 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));