使正则表达式匹配下一个实例而不是最后一个

时间:2013-08-04 12:02:58

标签: javascript regex match

我有以下文字组,想要提取粗体文字:

24.SSRTKNEWSHK1HNLYVR1865U30AUG- 4.1 .8387254346122C2  25.SSRTKNEWSHK1YVRHNL1864J22AUG- 5.1 .8387254346123C1   1.1YEUNG / LAWRENCE.KWANLEUNG * JWA 2.1YEUNG / LILY.LIMKUO * JWA   3.1YEUNG / ANDREA.LAUREN * JWA 4.1YEUNG / ETHAN.WESLEY * JWA  的 5.1YEUNG / WINSTON.JEREMY * JWA  1 WS1864J 22AUG TH YVRHNL HK5 600P 904P / O $ E.  2 WS1865U 30AUG FR HNLYVR HK5 1010P 656A#1 / O $ E

我想使用Javascript最终得到一个像这样的数组:

[0] ->  1.1YEUNG/LAWRENCE.KWANLEUNG*JWA  
[1] ->  2.1YEUNG/LILY.LIMKUO*JWA
[2] ->  3.1YEUNG/ANDREA.LAUREN*JWA  
[3] ->  4.1YEUNG/ETHAN.WESLEY*JWA
[4] ->  5.1YEUNG/WINSTON.JEREMY*JWA

到目前为止,我想出的是:/[\d]{1}\.[\d]{1}.+\*[A-Z]{3}/

这与文本匹配,但在同一行找到的任何匹配都被视为一个匹配,所以我最终得到:

[0] ->  1.1YEUNG/LAWRENCE.KWANLEUNG*JWA 2.1YEUNG/LILY.LIMKUO*JWA
[1] ->  3.1YEUNG/ANDREA.LAUREN*JWA 4.1YEUNG/ETHAN.WESLEY*JWA    
[2] ->  5.1YEUNG/WINSTON.JEREMY*JWA

我怎么能告诉这个正则表达式只匹配\*[A-Z]{3}的下一个内容而不是最后一个呢?

我正在使用RegexBuddy进行此操作,因此没有真正的javascript可以显示,但这是它在“使用”页面上生成的if语句:

if (subject.match(/[\d]{1}\.[\d]{1}.+\*[A-Z]{3}/)) {
    // Successful match
} else {
    // Match attempt failed
}

2 个答案:

答案 0 :(得分:1)

你的模式是贪婪的,.+抓住一切即可,模式仍然匹配。

此模式有效:

\d\.\d[A-Za-z].+?\*[A-Z]{3}

我通过添加.+使.+?懒惰,这意味着它匹配最小字符数,并且模式仍然匹配。

请注意,[\d]{1}\d{1}相同,与\d相同。我还强制将第二个数字后的字符设为[A-Za-z],否则第一个4.1的所有内容都将匹配。

答案 1 :(得分:0)

var text = [
    "24.SSRTKNEWSHK1HNLYVR1865U30AUG- 4.1 .8387254346122C2",
    "25.SSRTKNEWSHK1YVRHNL1864J22AUG- 5.1 .8387254346123C1",
    "1.1YEUNG/LAWRENCE.KWANLEUNG*JWA 2.1YEUNG/LILY.LIMKUO*JWA",
    "3.1YEUNG/ANDREA.LAUREN*JWA 4.1YEUNG/ETHAN.WESLEY*JWA",
    "5.1YEUNG/WINSTON.JEREMY*JWA 1 WS1864J 22AUG TH YVRHNL HK5 600P",
    "904P/O $ E 2 WS1865U 30AUG FR HNLYVR HK5 1010P 656A#1/O $ E"].join("\n");
text.match(/\d\.\d[a-z\/.*]+/igm);

但我不知道你的标准究竟是什么,所以如果这不符合你的要求,你需要更好地解释它。