【发布时间】:2020-09-04 20:53:41
【问题描述】:
我正在尝试编写一个 JavaScript 正则表达式,它将抓住行尾,除非所述行以右括号结尾,例如:
[word]
lengthy text line
[other word]
even lengthier text line! Whoo!
这部分我写了这个正则表达式new RegExp(/[\n]\n|(?![^\]])$/gm)
但即使没有双倍空格,我也需要能够抓住行尾,事实证明这非常困难,因为我对 Regex 知之甚少。
-- [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/)
}
【问题讨论】:
-
你忘了指明你需要什么最终结果,你要在什么方法中使用模式。我猜它正在分裂,所以你只需要
text.match(/^.*[^\]\n](?:\]\n.*[^\]\n])*$/gm) -
使用的方法是拆分,它将放置在文本区域中的值拆分并匹配到
array[i].match(/^\[(.*?)\]\n/) -
我是认真的,你需要使用
String#match,而不是String#split,因为你想避免后视。 -
是的!将 .split() 更改为 .match() 使其工作!几个小时和几天以来,我一直在用头撞墙,试图弄清楚这一点!
-
我在下面发布了解决方案,并附有解释。
标签: javascript regex regex-lookarounds