2012-07-10 39 views

回答

2

试试这个

^(?>\d{1,11})(?!af|a|f)((?:(?:c?o|co?).*)?.*)$ 

看到它here on regexr

我做了两个改变你的正则表达式:

  1. 我通过在开始添加?>所做的第一组atomic(?>\d{1,11}))。这是为了避免回溯到已经匹配的数字,

  2. 我加了一个negative lookahead(?!af|a|f),以确保没有af,a或f跟在后面。为了这个工作,我需要第一组是原子,以确保它真的会照顾最后一位数字。 (否则会原路返回,看到最后一位前提前,认为一切都很好,和字符串的其余部分与最后.*匹配)

+0

对于'一(> BC |?B)C'你可以说它与'a(bc)c'相同,但对于更复杂的表达式则不行。问题是:你有一个字符串“abc”和原子表达式。你的表情会匹配“a”,这很明显。然后它会尝试第一个替代的“bc”,它也会匹配,但是在交替之后有一个“c”,但是字符串完全匹配。通常它会回溯并尝试第二种选择,但由于它是一个原子组,它不会回溯,所以它会失败,因为字符串中没有“c”,可以与最后一个“c”匹配正则表达式。 – stema 2012-07-10 14:46:10

+0

好的,谢谢。为了得到一个带有数字部分“125”的MatchData对象,我修改了正则表达式,如下所示:^((?> \ d {1,11}))(?!af | a | f)((?:(?: c 2 O |??合)*)*)$ – 2012-07-12 07:46:07