正则表达式可选项

4

如果我有以下这个正则表达式

print_first = print_first.replace(/ T(op Choice)?/gi, "<span class='top_choice'>&nbsp;Top Choice</span>");

这个不应该匹配以下字符串吗:T, To, Top, Top C, Top Ch, Top Cho, Top Choi, Top Choic, Top Choice?

有没有更好的方法来做到这一点?

2个回答

5
整个字符组是可选的,但不是逐个字符选取。因此,您的正则表达式将匹配字符串 ' T'' Top Choice'
不幸的是,要实现这种逐个字符的行为的正则表达式相当丑陋。您需要使用一堆嵌套的可选组,例如以下内容:
/ T(o(p( (C(h(o(i(ce?)?)?)?)?)?)?)?)?/gi

或者,你可以使用带有|字符的交替方式。天真的方法会非常冗长,因为你需要列出所有的选项,这里提供一种比嵌套组更易读但依然聪明一点的方法:

/ Top Choice?| Top Choi?| Top Ch?| Top ?| To?/gi

因此,第一部分将匹配' Top Choice'' Top Choic',第二部分将匹配' Top Choi'' Top Cho',以此类推。请注意,在正则表达式中,较长的部分应该首先出现,这一点非常重要。


这也匹配 top_choice,如果你删除 /i 就不会匹配了。 - Pedro Lobito
这似乎无法用<span>替换字符串。 - user823527
你应该能够将这个正则表达式插入到你当前的代码中,并且它能按照预期工作,你可以编辑你的问题以包含你正在处理的字符串和期望的结果吗?在我的测试中,这个正则表达式将匹配你正在寻找的字符串。 - Andrew Clark
尽管更长,但正则表达式T(?:o(?:p(?: (?:C(?:h(?:o(?:i(?:ce?)?)?)?)?)?)?)?)?可能更好,因为它使用非捕获组而不是8个嵌套的捕获组。 - AeroX

0

使用一个非丑陋的正则表达式很困难。就编码而言,最整洁的方法是迭代字母并去掉最后一个字母。

String r = "TopChoice";
while (r.length() > 0) {
    //Check for match to String r
    r = r.substring(0, r.length() - 1).trim();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接