Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.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正则表达式_Javascript_Regex - Fatal编程技术网

获取两个短语之间的单独匹配的JavaScript正则表达式

获取两个短语之间的单独匹配的JavaScript正则表达式,javascript,regex,Javascript,Regex,我可以使用什么正则表达式模式来解析以下文本: Mission m1 "Mission a is completing exam" End Mission Something is not necessary Task t1 "Task b is keeping house" comment: "... End Task" End Task abc Task t2 Do something End Task 。。因此,它看起来如下所示: [1]: Mission m1 "Mission a is

我可以使用什么正则表达式模式来解析以下文本:

Mission m1
"Mission a is completing exam"
End Mission
Something is not necessary
Task t1
"Task b is keeping house"
comment: "... End Task"
End Task
abc
Task t2
Do something
End Task
。。因此,它看起来如下所示:

[1]:
Mission m1
"Mission a is completing exam"
End Mission

[2]:
Task t2
Do something
End Task

[3]:
Task t2
Do something
End Task

我尝试了这个正则表达式模式
\b(?:Mission | Task)\b(.\n)*\b(?:Mission | Task)\b
-问题是它只返回一个包含三个部分的结果。

您的正则表达式看起来不错,但可能
(^ |\n)(Mission | Task)
已经满足您的需要(查找所有以“任务”或“任务”开头的行。原因是我认为您的最终目标不需要与整个段落匹配-见下文)。您的主要问题可能是您没有使用:

另一个问题是(我认为)您正在使用XY。我认为上面的正则表达式和
replace
在这里会更容易,但由于您希望每个匹配项都有不同的替换项,因此不能仅使用:

您可以使用函数和全局变量解决此问题:

var index = 1;
yourText.replace(pattern,function(x){ return "P"+(index++)+"\n"+x;})
注意,
/g
将导致replace处理字符串中的所有匹配项。如果仍要使用您的模式,只需添加
/g

编辑
忘记发布。

这是对上一个答案的完全重写,因为您的输入与开始时显示的内容大不相同

您需要一个简单的正则表达式来匹配两个字符串之间的字符串:

/^(Mission|Task)\b[\s\S]*?^End \1$/mg
下面是同一个正则表达式的示例:

/^(Mission|Task)\b.*(?:\r?\n(?!End \1).*)*\r?\nEnd \1$/gm

详细信息

  • ^
    -行的开头
  • (任务|任务)\b
    -要么
    任务
    要么
    任务
    全字
  • [\s\s]*?
    -任何0+字符,尽可能少到第一个字符
  • ^End\1$
    -
    End
    ,空格和单词作为一整行捕获到组1中

使用
split
函数。使用双换行符拆分:
s.split(“\n\n”)
。或者使用
s.split(/^(?=Task | Mission)/m)
好吧!我打算找出具有“任务…结束任务”或“任务…结束任务”结构的文本块。块外有一些不必要的字符串与结果不匹配。我已检查了您的新输入,并相应地更新了答案。
/^(Mission|Task)\b[\s\S]*?^End \1$/mg
/^(Mission|Task)\b.*(?:\r?\n(?!End \1).*)*\r?\nEnd \1$/gm