我可以使用什么正则表达式模式来解析以下文本:
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
- 问题是它只返回一个包含三个部分的结果。
答案 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
- Mission
或Task
全文[\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。