JavaScript RegExp:格式化之前给定格式的所有匹配项

时间:2018-04-22 11:08:45

标签: javascript regex

我有这个虚拟输入数据:

john: buys beer sam: eats bananas *** DIVIDER irrelevant actions luis: walking

捕获人员行为的regex/^[\S]*:.*/gm

我需要对其进行修改,使其仅包含在文本下方达到给定模式(*** DIVIDER)的操作。

我以为我可能会使用例如/^[\S]*:.*(?=[\S]*\sDIVIDER)/gm但由于某种原因它无效。

我设置了regex101 link来播放

2 个答案:

答案 0 :(得分:1)

你正在寻找线条,你需要在积极的前瞻中使用[\s\S]*?。然而,说话表现明智,这不是一个好习惯。实现它的一种快速方法是匹配模式\S+:.*之后的所有行,然后查看它们是否后跟分隔符:

^(?:[^:\s]+:.*\s+)+(?=.*?DIVIDER)

Live demo



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

为了让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]*忽略下一行
  • )?此论坛是可选的

希望它有所帮助!