【问题标题】:Discard the leading and trailing series of a character, but retain the same character otherwise丢弃一个字符的前导和尾随系列,否则保留相同的字符
【发布时间】:2012-05-31 07:58:57
【问题描述】:

我必须按照以下规则处理字符串:

  • 它可能以也可能不以一系列'开头。
  • 它可能会也可能不会以一系列' 结尾。
  • 应提取上述内容之间的任何内容。但是,包含的字符串也可能包含也可能不包含一系列'

例如,我可以得到以下字符串作为输入:

  • ''''aa''''
  • ''''aa
  • aa''''
  • ''''aa''bb''cc''''

对于上面的例子,我想分别从中提取以下内容:

  • aa
  • aa
  • aa
  • aa''bb''cc

我在 Java 中尝试了以下代码:

Pattern p = Pattern.compile("[^']+(.+'*.+)[^']*");
Matcher m = p.matcher("''''aa''bb''cc''''");
while (m.find()) {
    int count = m.groupCount();
    System.out.println("count = " + count);
    for (int i = 0; i <= count; i++) {
        System.out.println("-> " + m.group(i));
    }

但我得到以下输出:

count = 1
-> aa''bb''cc''''
-> ''bb''cc''''

任何指针?

编辑:没关系,我在正则表达式的末尾使用了*,而不是+。做这个改变给了我想要的输出。但我仍然欢迎对正则表达式进行任何改进。

【问题讨论】:

  • 看看这个问题,我认为这是一个好的开始:stackoverflow.com/questions/2088037/trim-characters-in-java
  • 谢谢。我确实想过使用修剪,但我打消了这个想法。我想这会比使用正则表达式更好,不是吗?
  • 好吧,修剪实际上不会这样做。问这个问题的人我肯定是这样问的,因为他们所追求的操作在逻辑上似乎与 trim 所做的类似。但是看看那里接受的答案。建议是使用一种称为“strip”的方法来完成您想要做的事情。除非您出于教育目的这样做,否则我会这样做。
  • 实际上,我现在意识到我要寻找的不过是“修剪”,即从字符串的开头和结尾修剪'。 (我只是惊讶于我在这里是多么愚蠢!)
  • Trim 在 Java 中不会这样做。它仅适用于空格。但是,来自 Apache Commons 的 strip 确实具有该功能。

标签: java regex


【解决方案1】:

这个对我有用。

        String str = "''''aa''bb''cc''''";
        Pattern p = Pattern.compile("^'*(.*?)'*$");
        Matcher m = p.matcher(str);
        if (m.find()) {
            System.out.println(m.group(1));
        }

【讨论】:

  • 谢谢,您的正则表达式比我的要好得多。但是,我现在使用 Apache Commons 中的 StringUtils.stripStart(String, String)StringUtils.stripEnd(String, String) 来实现同样的目的。
【解决方案2】:

查看 Java 的 Pattern 类的边界匹配器 (http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html)。尤其是 $(= 行尾)可能很有趣。我还推荐以下用于正则表达式测试的 Eclipse 插件:http://sourceforge.net/projects/quickrex/ 它使您可以准确地查看给定测试字符串的匹配项和正则表达式组。

例如尝试以下模式: [^']+(.+'*.+)+[^'$]

【讨论】:

    【解决方案3】:

    我的 Java 不太好,所以我希望正则表达式就足够了。对于您的示例,它是works well

    s/^'*(.+?)'*$/$1/gm
    

    【讨论】:

    • 好,可以(.*)。该问题可以重新表述为带状标题和尾随引号。
    • 是的,像 C# 中的 .Trim(new[] {'\''}) 会做得更好。
    • s = s.replaceFirst("^'*(.*)'*$", "$1");
    • @JoopEggen 是的,我现在正在使用来自 Apache Commons 的 StringUtilsstripStartstripEnd
    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 2022-01-20
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多