【问题标题】:How to replace a block of text using regex and java如何使用正则表达式和java替换文本块
【发布时间】:2012-01-20 07:48:27
【问题描述】:

我有同样的问题,但我需要得到:

---- comment 3;comment 2;comment 1

发件人:

* (20-01-2012 12:53) : ---- comment 3<br/>* (20-01-2012 12:50) : comment 2<br/>* (20-01-2012 12:50) : comment 1

这意味着我的代码应该是:

string.replaceAll("\\*?.*?:", ";")

正确吗?

但这正在替换从第一个 * 到最后一个的所有内容:所以我得到:

comment 1 

结果。救命!

链接自Replace/remove String between two character

【问题讨论】:

    标签: java regex replace


    【解决方案1】:

    myString = myString.replaceAll("\\*\\s+\\(.*?\\)\\s+:\\s+", "").replaceAll("&lt;br/&gt;", ";");

    我试过了。第一个 replaceAll 替换行中的 * (date/time) : 前缀,第二个 replaceAll 用 ;s 替换 &lt;br/&gt;s。

    【讨论】:

    • ok 看起来几乎是我正在寻找的结果,但我将其更改为:coderemark = remark.replaceAll("(\*\\s+\(.*?\)\ \s+)(.*?):\\s+", ""); remark = remark.replaceAll("
      ", ";");code
    【解决方案2】:

    在上一个答案中,它使用#? 作为分隔符。在这里你写\*? 这意味着匹配* 字面意思或什么都不匹配。然后.*? 将匹配任何东西直到:。这意味着将发生多次替换并删除任何内容,直到冒号(包括在内)。您的替换字符串中应该有多个 ;

    我看到的模式是:

    * (...) : ... comment 1<br/>
    

    &lt;br/&gt;可选。

    因此尝试如下正则表达式:

    \* \([^)]*\) : ((?:.*?)comment \d+)(?:<br/>)?
    

    请注意,(?: ... ) 使带括号的正则表达式不分组。你可以在http://rubular.com/r/orViHMJEMr查看结果

    此处提供的正则表达式允许您获取 cmets。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class TestRegex {
        public static void main(String[] args) {
            String pattern_string = "\\* \\([^)]*\\) : ((?:.*?)comment \\d+)(?:<br/>)?";
            String input_string = "* (20-01-2012 12:53) : ---- comment 3<br/>* (20-01-2012 12:50) : comment 2<br/>* (20-01-2012 12:50) : comment 1";
    
            Pattern pattern = Pattern.compile(pattern_string);
            Matcher matcher = pattern.matcher(input_string);
            while (matcher.find()) {
                System.out.println(matcher.group(1));
            }
        }
    }
    

    【讨论】:

    • 这确实有效,但该死!这对我来说是使用组的过度杀伤力,然后是可选组 - 我花了一段时间才明白你在做什么:) 不过我 +1
    • 正则表达式可能看起来很复杂,但我不这么认为。该小组使我们能够得到我们需要的东西。非分组不是必需的,但我像某种优化一样使用它。模式的其余部分与我们要匹配的输入具有相同的结构。 [^)]* is also some kind of optimization. I could have done .*?` 代替。
    • 嗯,好的,@lkuty,但模式是
      * (...) : ... 带有
      可选。并且评论不是固定的,我只是用comment1 ,2,3 作为例子,所以这看起来比我预期的要复杂一些......
    • 那么问题没有明确说明。无论如何,正则表达式是适应性强的。
    【解决方案3】:

    看来您需要将&lt;br/&gt;* (20-01-2012 12:50) : 替换为;

    一个好的匹配正则表达式可能是:

    (<br/>)\*\s*\(.*?\)\s*:\s*
    

    匹配部分应替换为;

    对于开始部分,正则表达式应该是:

    ^\*\s*\(.*?\)\s*:\s*
    

    应该用空字符串替换。

    【讨论】:

    • 几乎,但正在添加一个额外的;在第一条评论之前......嗯,认为@Ademiban 是最接近我真正想要发生的事情......感谢您的努力! :)
    猜你喜欢
    • 2017-01-21
    • 2018-03-16
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多