Javascript正则表达式从错误的起点匹配

时间:2014-12-16 04:02:11

标签: javascript regex

鉴于以下源文本,使用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测试面板截图,以获得更好的解释。 如何将我的正则表达式更改为与指示点相匹配?

enter image description here

2 个答案:

答案 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,}/);