【问题标题】:Regex Match End of Line Unless it Ends with a Closed Bracket正则表达式匹配行尾,除非它以右括号结尾
【发布时间】: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


【解决方案1】:

您可以使用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));

【讨论】:

    【解决方案2】:

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

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

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

    为方便起见,完全匹配将文本保留在括号之间。第一组只包括不带括号的文本。

    【讨论】:

    • 这似乎收集了整个短语,而不是像我发布的正则表达式那样抓住行尾。运行正则表达式的脚本将代码拆分为一个数组,如 ["[word]↵longy text line", "", "[other word]↵even longier text line! Whoo!"] 注意:中间的空格是由双倍空格引起的,在运行时会被忽略。
    猜你喜欢
    • 2018-02-06
    • 2016-06-21
    • 2017-08-12
    • 2018-02-10
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2021-01-17
    相关资源
    最近更新 更多