【问题标题】:Regular expressions optional items正则表达式可选项目
【发布时间】:2014-06-08 13:53:39
【问题描述】:

如果我有这个正则表达式

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?

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

【问题讨论】:

    标签: java html regex


    【解决方案1】:

    整个组都是可选的,但不是一个字符一个字符,要么全有,要么全无。因此,您的正则表达式将匹配字符串 ' 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就不会了
    • 这似乎没有用 替换字符串。
    • 您应该能够将此正则表达式插入您当前的代码并使其按预期工作,您能否编辑您的问题以包含您正在使用的字符串以获得预期结果?在我的测试中,这个正则表达式将匹配你正在寻找的字符串。
    • 虽然更长,但正则表达式 T(?:o(?:p(?: (?:C(?:h(?:o(?:i(?:ce?)?)?)?)?)?)?)?)? 可能会更好,因为它使用非捕获组而不是 8 个嵌套捕获组
    【解决方案2】:

    很难使用不难看的正则表达式。就编码而言,最简洁的方法是遍历字母并剪掉最后一个。

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

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 2010-11-04
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多