Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript RegExp:在模式之前给定格式的所有匹配项_Javascript_Regex - Fatal编程技术网

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

JavaScript RegExp:在模式之前给定格式的所有匹配项,javascript,regex,Javascript,Regex,我有这个虚拟输入数据: 约翰:买啤酒 山姆:吃香蕉 ***分隔器 无关行为 路易斯:走路 以及捕获人的动作的正则表达式:/^[\s]*:.*/gm 我需要对其进行修改,使其仅包括在文本下方给定模式(***分隔符)下的操作 我想我可能会使用例如/^[\S]*:.*(=[\S]*\sDIVIDER)/gm,但由于某种原因它不起作用 我设置了一个播放如果您正在查看行,则需要在正向前瞻中使用[\s\s]*?。然而,就性能而言,这不是一个好的做法。实现此功能的一个快速方法是匹配模式\S+:..*后面的所

我有这个虚拟输入数据:

约翰:买啤酒 山姆:吃香蕉 ***分隔器 无关行为 路易斯:走路

以及捕获人的动作的
正则表达式:
/^[\s]*:.*/gm

我需要对其进行修改,使其仅包括在文本下方给定模式(
***分隔符
)下的操作

我想我可能会使用例如
/^[\S]*:.*(=[\S]*\sDIVIDER)/gm
,但由于某种原因它不起作用


我设置了一个播放

如果您正在查看行,则需要在正向前瞻中使用
[\s\s]*?
。然而,就性能而言,这不是一个好的做法。实现此功能的一个快速方法是匹配模式
\S+:..*
后面的所有行,然后查看它们是否后跟分隔符:

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

var s=`约翰:买啤酒
山姆:吃香蕉
***分隔器
无关行为
路易斯:走路
约翰:买啤酒;

log(s.match(/^(?:[^:\s]+:.*\s+(?=.*?分隔符)/gm))当您在各行之间查找时,需要在正向前瞻中使用
[\s\s]*?
。然而,就性能而言,这不是一个好的做法。实现此功能的一个快速方法是匹配模式
\S+:..*
后面的所有行,然后查看它们是否后跟分隔符:

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

var s=`约翰:买啤酒
山姆:吃香蕉
***分隔器
无关行为
路易斯:走路
约翰:买啤酒;

log(s.match(/^(?:[^:\s]+:.*\s+(?=.*?分隔符)/gm))解决问题的另一种方法是充分利用正则表达式的强大功能简化javascript代码,同时避免可能的格式错误(例如尾随空格、空行、缺少字段)。此外,它不使用中缺少的
s
标志

正则表达式 我最终得到了以下正则表达式:

^\s*([^:]*):\s*([^\n]*)(?:\n[^\n]*除法器[^\n]*\n[^\n]*)?$

Regex101可用

捕获组 对于每行,正则表达式将输出2个匹配组:

  • 第一个包含修剪后的用户

  • 包含修剪动作的第二个

Javascript 为了让javascript提取所有匹配的组(即flag
g
),必须在数据匹配时执行正则表达式

//1。初始数据
var regex=/^\s*([^:]*):\s*([^\n]*)(?:\n[^\n]*除法器[^\n]*\n[^\n]*)?$/gm;
var输出=[];
var input=`user1:购买啤酒
用户2:吃香蕉
***分隔器
无关行为
用户3:步行
用户4:买啤酒
用户5:吃香蕉
***分隔器
无关行为
usr6:步行
:吃香蕉
user7:`;
// 2. 迭代匹配
while(match=regex.exec(输入))
push({用户:匹配[1],操作:匹配[2]})
// 3. 用结果做事

console.log(output)
解决问题的另一种方法是充分利用正则表达式的强大功能简化javascript代码,同时避免可能的格式错误(例如尾随空格、空行、缺少字段)。此外,它不使用中缺少的
s
标志

正则表达式 我最终得到了以下正则表达式:

^\s*([^:]*):\s*([^\n]*)(?:\n[^\n]*除法器[^\n]*\n[^\n]*)?$

Regex101可用

捕获组 对于每行,正则表达式将输出2个匹配组:

  • 第一个包含修剪后的用户

  • 包含修剪动作的第二个

Javascript 为了让javascript提取所有匹配的组(即flag
g
),必须在数据匹配时执行正则表达式

//1。初始数据
var regex=/^\s*([^:]*):\s*([^\n]*)(?:\n[^\n]*除法器[^\n]*\n[^\n]*)?$/gm;
var输出=[];
var input=`user1:购买啤酒
用户2:吃香蕉
***分隔器
无关行为
用户3:步行
用户4:买啤酒
用户5:吃香蕉
***分隔器
无关行为
usr6:步行
:吃香蕉
user7:`;
// 2. 迭代匹配
while(match=regex.exec(输入))
push({用户:匹配[1],操作:匹配[2]})
// 3. 用结果做事

console.log(output)
首先在分割器上分割一条路首先在分割器上分割一条路这似乎解决了问题。但是,我不确定为什么我原来的lookahead
(?=[\S]*\sDIVIDER)
无法工作。我想我对前瞻性的理解是错误的。顺便问一下,
/s
标志是什么?它不属于正则表达式中的
标志
列表@MDNDot
不超过一行,也不属于
\S*\S
。后者可以选择多行,但不能选择多行。要超出行,您需要在大多数样式中使用
[\s\s]*?
s
DOTALL
)标志。我忘了提到JS缺乏对
s
标志的支持,尽管它是为ES2018而提出的。我的错,谢谢。这很有帮助!这很奇怪。我试着运行你的代码片段,
match
方法的输出是一个由1个元素组成的数组,而其中应该有两个O_O@knitevision可以修改regex,使每一行都在一个单独的数组值中,但是如果按
\n
分割输出,速度会快得多。谢谢,这似乎解决了这个问题。但是,我不确定为什么我原来的lookahead
(?=[\S]*\sDIVIDER)
无法工作。我想我对前瞻性的理解是错误的。顺便问一下,
/s
标志是什么?它不属于正则表达式中的
标志
列表@MDNDot
不超过一行,也不属于
\S*\S
。后者可以选择多行,但不能选择多行。超越你需要的界限<