我有这个虚拟输入数据:
john: buys beer
sam: eats bananas
*** DIVIDER
irrelevant actions
luis: walking
捕获人员行为的regex
:/^[\S]*:.*/gm
我需要对其进行修改,使其仅包含在文本下方达到给定模式(*** DIVIDER
)的操作。
我以为我可能会使用例如/^[\S]*:.*(?=[\S]*\sDIVIDER)/gm
但由于某种原因它无效。
我设置了regex101 link来播放
答案 0 :(得分:1)
你正在寻找线条,你需要在积极的前瞻中使用[\s\S]*?
。然而,说话表现明智,这不是一个好习惯。实现它的一种快速方法是匹配模式\S+:.*
之后的所有行,然后查看它们是否后跟分隔符:
^(?:[^:\s]+:.*\s+)+(?=.*?DIVIDER)
var s = `john: buys beer
sam: eats bananas
*** DIVIDER
irrelevant actions
luis: walking
john: buys beer`;
console.log(s.match(/^(?:[^:\s]+:.*\s+)+(?=.*?DIVIDER)/gm));

答案 1 :(得分:1)
解决问题的另一种方法是充分利用正则表达式的强大功能来简化javascript代码以及避免可能的格式错误(例如尾随空格,空行,缺少字段)。此外,它不会使用MDN documentation中缺少的s
标记。
我最终得到了以下正则表达式:
^\s*([^:]*):\s*([^\n]*)(?:\n[^\n]*DIVIDER[^\n]*\n[^\n]*)?$
Regex101可用here
对于每一行,正则表达式将输出2个匹配的组:
第一个包含修剪过的用户
第二个包含修剪过的动作
为了让javascript提取所有匹配的组(,即flag g
),您必须在数据匹配时执行正则表达式。
// 1. init data
var regex = /^\s*([^:]*):\s*([^\n]*)(?:\n[^\n]*DIVIDER[^\n]*\n[^\n]*)?$/gm;
var output = [];
var input = `user1: buys beer
user 2: eats bananas
*** DIVIDER
irrelevant actions
user-3: walking
user 4: buys beer
user5:eats bananas
*** DIVIDER
irrelevant actions
usr6: walking
: eats bananas
user7:`;
// 2. iterate over matches
while( match = regex.exec(input) )
output.push({user: match[1], action: match[2]})
// 3. do stuff with result
console.log(output)

正则表达式语法可以避免(在此示例中)一些可能的错误:
此外,提取数据的代码只需2行(见下面的代码)。
\s*
在用户之前忽略可能的空格字符
([^:]*)
匹配用户(除:
以外的任何字符):
分隔符:用户和操作之间\s*
在操作 ([^\n]*)
匹配操作,直到行尾(?:
包含DIVIDER部分的非捕获组
\n
检查下一行[^\n]*DIVIDER
一直持续到" DIVIDER "达到[^\n]*\n
忽略DIVIDER行的结尾[^\n]*
忽略下一行)?
此论坛是可选的希望它有所帮助!