JavaScript正则表达式,以获得两个短语之间的分隔匹配

时间:2017-01-01 08:53:23

标签: 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 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 - 问题是它只返回一个包含三个部分的结果。

2 个答案:

答案 0 :(得分:2)

这是对上一个答案的完全重写,因为您的输入与您在开头时所显示的完全不同。

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

/^(Mission|Task)\b[\s\S]*?^End \1$/mg

以下是相同正则表达式的unrolled version

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

请参阅regex demo

<强>详情:

  • ^ - 开始行
  • (Mission|Task)\b - MissionTask全文
  • [\s\S]*? - 任何0+字符,尽可能少到第一个...
  • ^End \1$ - End,空格以及捕获到第1组中的单词,作为整行。

答案 1 :(得分:1)

你的正则表达式似乎没问题,但可能(^|\n)(Mission|Task)足以满足你的需求(查找所有以'Mission'或'Task'开头的行。原因是我不认为你的最终目标需要与整个段落 - 见下文)。您的主要问题可能是您没有使用global modifier

pattern=/(^|\n)(Mission|Task)/g;

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

yourText.replace(pattern,constantString)

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

var index = 1;
yourText.replace(pattern,function(x){ return "P"+(index++)+"\n"+x;})

注意/g将导致replace对字符串中的所有匹配项起作用。如果您仍想使用您的模式,只需添加/g

修改 忘了发布fiddle