簡體   English   中英

可以在兩個特定的正則表達式匹配之間獲取文本嗎?

[英]Possible to get text between two specific Regular Expression Matches?

我必須解析的文本是這樣的:

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'

因此,現在的結束匹配是match [6]而不是match [5]。

因此,它不能只是將兩個匹配項的文本作為所需文本的開頭和結尾的正則表達式。

它必須是match [1]的位置到match [6]的位置之間的所有文本。

我希望我從一開始就考慮過這樣解釋。 我認為這更加清楚。

自從問題被編輯以來,我以前的問題得到了徹底的改善。

您需要在以下正則表達式的某些匹配項之間獲取子字符串:

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>"; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM