gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:18:15 25 4
gpt4 key购买 nike

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

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]。

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

必须是匹配[1]的位置到匹配[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>";

关于javascript - 可以获取两个特定正则表达式匹配之间的文本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35632622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com