鉴于以下源文本,使用javascript,我需要匹配以下摘录。
我的正则表达式(我到目前为止):
subject.match(/\s\([A-Z]{3}\)[\w\s]+\([A-Z]{3}\)[\s\S]*?\([A-Z]\)/)
摘录(我需要匹配):
Atlanta (ATL) to Charlotte (CLT) — Wed, Dec 17
American Airlines Inc. 658
Dep: 5:50 am
Arr: 6:57 am
1h 7m
Airbus A321
Economy (L)
来源(获取匹配的文字组,取自textarea):
Atlanta (ATL) to Cancun (CUN) — Wed, Dec 17
Long layover
Atlanta (ATL) to Charlotte (CLT) — Wed, Dec 17
American Airlines Inc. 658
Dep: 5:50 am
Arr: 6:57 am
1h 7m
Airbus A321
Economy (L)
OPERATED BY US AIRWAYS
Layover in CLT
2h 33m
Charlotte (CLT) to Cancun (CUN) — Wed, Dec 17
American Airlines Inc. 883
Dep: 9:30 am
Arr: 11:26 am
2h 56m
Boeing 767
Economy (L)
Food for Purchase
OPERATED BY US AIRWAYS
Cancun (CUN) to Atlanta (ATL) — Wed, Dec 24
Long layover
Cancun (CUN) to Miami (MIA) — Wed, Dec 24
American Airlines Inc. 1157
Dep: 12:01 pm
Arr: 2:40 pm
1h 39m
Boeing 737
Economy (G)
Layover in MIA
3h 40m
Miami (MIA) to Atlanta (ATL) — Wed, Dec 24
American Airlines Inc. 349
Dep: 6:20 pm
Arr: 8:25 pm
2h 5m
Boeing 737
Economy (G)
我的问题:当源文本中的某些行重复时,我的正则表达式从错误的起点开始匹配。请参阅下面的RegexBuddy测试面板截图,以获得更好的解释。 如何将我的正则表达式更改为与指示点相匹配?
答案 0 :(得分:1)
我用这个解决了这个问题:
subject.match(/\s\([A-Z]{3}\)[\w\s]+\([A-Z]{3}\).*\n(?:.{3,}\n)*.*\([A-Z]\)/)
刚刚完成第一行非换行元素(0或更多),然后匹配换行符(只有1),然后匹配所有长度为3或更长的行,直到最后(不得不填写)。< / p> PD:那里有一个非捕获组,无害。
答案 1 :(得分:0)
你的正则表达式的一个问题是你在第二个右括号之前允许任何东西,包括换行符。这导致结束匹配字符串“(L)”。如果您可以在要求中包含至少需要三行文字才能开始匹配,那么以下内容可能对您有用:
subject.match(/\s\([A-Z]{3}\)[^\r\n]+\([A-Z]{3}\)([^\r\n]+[\r\n]){3,}/);