可以在两个特定的正则表达式匹配之间获取文本吗?

时间:2016-02-25 16:14:51

标签: javascript regex

我必须解析的文字是这样的:

var textToParse = "INTRO

1.  MORE INTRO

2.  THINGS

3.  CONTENTS.   The 200 teststs.  The 300 test. 

4.  REF.  jytjndga.

5.  COLORING BOOK.  The 400 teststs.  The 500 test. 

WETRJEWO /EWRGGWE RE

100.
FUN STUFF

101.
RTHRT QWERATGER

A.  WSHNJDBRTH ARGSERTHERTHB

B. aqhretgwaefawef

C. trtrrttrtrtr

101.1
loads
   .2
thinking of loading
   .3
Loading 
   .4
unloading
   .5
reloading
   .6 
deloading
   .7
reREloading
   .8
done loading
   .9
not loading
   .10
fish

200.
PROCEDURES

201.
PROCEDURES 1

202.
PROCEDURES 2

A.  hear about procedure 203.

B.  think about procedure 203.

C.  eat cookie

D.  procrastinate

E.  sleep.

203.
PROCEDURES 3

203.1
A.  Trim Lawn

203.
PROCEDURES 3 (CONT’D)

203.1
B.  Clean stuff

C.  Finsih cleaning

204.
PROCEDURES 4

204.1
A.  wax on.

B.  Wax off

C.  crane kick

D.  Don't sweep the leg

E.  Sweep leg anyway

204.
PROCEDURES 4 (CONT’D)

204.1
F.  Finish procedure

205.
LAUNDRY DAY";

我将此正则表达式运行到所有主要部分标题(以及一些不是):

var sectionHeadersRegex = /^\s*\d{3}\.?(\s|$)/;

所以我的问题是:我希望获得两场比赛之间的所有文字。

例如,我想获得match [1]('101。')和match [5]('203。')之间的所有文本。

所以文本将是:

var desireText = "RTHRT QWERATGER

A.  WSHNJDBRTH ARGSERTHERTHB

B. aqhretgwaefawef

C. trtrrttrtrtr

101.1
loads
   .2
thinking of loading
   .3
Loading 
   .4
unloading
   .5
reloading
   .6 
deloading
   .7
reREloading
   .8
done loading
   .9
not loading
   .10
fish

200.
PROCEDURES

201.
PROCEDURES 1

202.
PROCEDURES 2

A.  hear about procedure 203.

B.  think about procedure

C.  eat cookie

D.  procrastinate

E.  sleep.
";

我知道在比赛开始时有一些额外的空格,我知道一个答案就是我可以使用额外的空格来制作它,这样如果我像这样做一个正则表达式:

var newRegexToGetTextBetweenMatchesOneandFive = new RegExp(' + match[1] + '([^~]+?)' + match[5] + '');

但我不能依赖标题号前缀的空格来防止错误匹配。

即使我可以,我的目标是基本上可以说“在第二场比赛和第六场比赛之间获得所有文字”,而不是“获得'101'之间的所有文字。”和''203。“。

感谢您的帮助,如果我能澄清任何事情,请告诉我。

编辑:

@Dawg抱歉让人困惑。我认为这个例子可以解决问题。 @Wiktor你的答案似乎是以同样的方式获取文本。

我修改了需要稍微解析的文本,这样我就可以用你完成的方式来解决问题。

var str = 'var textToParse = "INTRO\n\n1.  MORE INTRO\n\n2.  THINGS\n\n3.  CONTENTS.   The 200 teststs.  The 300 test. \n\n4.  REF.  jytjndga.\n\n5.  COLORING BOOK.  The 400 teststs.  The 500 test. \n\nWETRJEWO /EWRGGWE RE\n\n100.\nFUN STUFF\n\n101.\nRTHRT QWERATGER\n\nA.  WSHNJDBRTH ARGSERTHERTHB\n\nB. aqhretgwaefawef\n\nC. trtrrttrtrtr\n\n101.1\nloads\n   .2\nthinking of loading\n   .3\nLoading \n   .4\nunloading\n   .5\nreloading\n   .6 \ndeloading\n   .7\nreREloading\n   .8\ndone loading\n   .9\nnot loading\n   .10\nfish\n\n200.\nPROCEDURES\n\n201.\nPROCEDURES 1\n\n202.\nPROCEDURES 2\n\nA.  hear about procedure 203.\n\nB.  think about procedure 203.\n\nC.  eat cookie\n\nD.  procrastinate\n\nE.  sleep.\n\n203.\n THIS SHOULD BE CAPTURED\n\n203.\nPROCEDURES 3\n\n203.1\nA.  Trim Lawn\n\n203.\nPROCEDURES 3 (CONT’D)\n\n203.1\nB.  Clean stuff\n\nC.  Finsih cleaning\n\n204.\nPROCEDURES 4\n\n204.1\nA.  wax on.\n\nB.  Wax off\n\nC.  crane kick\n\nD.  Don\'t sweep the leg\n\nE.  Sweep leg anyway\n\n204.\nPROCEDURES 4 (CONT’D)\n\n204.1\nF.  Finish procedure\n\n205.\nLAUNDRY DAY";';

我修改了部分内容:

'sleep.\n\n203.\nPROCEDURES'

为:

'sleep.\n\n203.\n THIS SHOULD BE CAPTURED\n\n203.\nPROCEDURES'

所以现在结束比赛是匹配[6]而不是匹配[5]。

所以它不能只是一个正则表达式,其中包含两个匹配项的文本作为所需文本的开头和结尾。

它必须是匹配[1]的LOCATION与匹配[6]的位置之间的所有文本。

我希望我从一开始就考虑过这样解释。我认为这更清楚。

1 个答案:

答案 0 :(得分:1)

自编辑问题以来我以前的修改工作的全面改造。

您需要在以下正则表达式的某些匹配项之间获取子字符串:

var re = /^\s*\b\d{3}\.?(?:\s|$)/gm;

然后,当你准备好str时,你可以为匹配的索引定义一个数组:

var indices = [];

然后,使用RegExp.exec()迭代所有匹配项:

while((m = re.exec(str)) !== null) {
   indices.push({ start: m.index, end: m.index+m[0].length});
}

注意如何获得起始位置和结束位置:起始位置可以从MatchObject.index属性获得,结束索引是索引和匹配值(m[0])长度的总和。

接下来,您应该使用带有string.substring方法的索引获取所需的文本(请参阅传递的16索引):

va0r newRegexToGetTextBetweenMatchesOneandFive = str.substring(indices[1].end, indices[6].start);

使用的第一个indices[1]属性是end(因为我们需要从第一个匹配结束时获取文本,第二个indices[6]属性为start需要子串直到第6场比赛。

整个演示如下。

var re = /^\s*\b\d{3}\.?(?:\s|$)/gm; 
var str = 'var textToParse = "INTRO\n\n1.  MORE INTRO\n\n2.  THINGS\n\n3.  CONTENTS.   The 200 teststs.  The 300 test. \n\n4.  REF.  jytjndga.\n\n5.  COLORING BOOK.  The 400 teststs.  The 500 test. \n\nWETRJEWO /EWRGGWE RE\n\n100.\nFUN STUFF\n\n101.\nRTHRT QWERATGER\n\nA.  WSHNJDBRTH ARGSERTHERTHB\n\nB. aqhretgwaefawef\n\nC. trtrrttrtrtr\n\n101.1\nloads\n   .2\nthinking of loading\n   .3\nLoading \n   .4\nunloading\n   .5\nreloading\n   .6 \ndeloading\n   .7\nreREloading\n   .8\ndone loading\n   .9\nnot loading\n   .10\nfish\n\n200.\nPROCEDURES\n\n201.\nPROCEDURES 1\n\n202.\nPROCEDURES 2\n\nA.  hear about procedure 203.\n\nB.  think about procedure 203.\n\nC.  eat cookie\n\nD.  procrastinate\n\nE.  sleep.\n\n203.\n THIS SHOULD BE CAPTURED\n\n203.\nPROCEDURES 3\n\n203.1\nA.  Trim Lawn\n\n203.\nPROCEDURES 3 (CONT’D)\n\n203.1\nB.  Clean stuff\n\nC.  Finsih cleaning\n\n204.\nPROCEDURES 4\n\n204.1\nA.  wax on.\n\nB.  Wax off\n\nC.  crane kick\n\nD.  Don\'t sweep the leg\n\nE.  Sweep leg anyway\n\n204.\nPROCEDURES 4 (CONT’D)\n\n204.1\nF.  Finish procedure\n\n205.\nLAUNDRY DAY";';
var indices = [];
while((m = re.exec(str)) !== null) {
   indices.push({ start: m.index, end: m.index+m[0].length});
}
var newRegexToGetTextBetweenMatchesOneandFive = str.substring(indices[1].end, indices[6].start); 
document.body.innerHTML = "<pre>" + newRegexToGetTextBetweenMatchesOneandFive + "</pre>";