如何使用正则表达式和java替换文本块

时间:2012-01-20 07:48:28

标签: java regex replace

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

---- 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

链接

3 个答案:

答案 0 :(得分:1)

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

我看到的模式是:

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

<br/>可选。

因此尝试使用正则表达式:

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

请注意(?: ... )使括号正则表达式不分组。您可以在http://rubular.com/r/orViHMJEMr

查看结果

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

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 :(得分:1)

myString = myString.replaceAll("\\*\\s+\\(.*?\\)\\s+:\\s+", "").replaceAll("<br/>", ";");

它已经尝试了。第一次替换所有替换行中的* (date/time) :前缀,第二次替换所有用<br/>替换; s。

答案 2 :(得分:0)

好像您需要将<br/>* (20-01-2012 12:50) :替换为;

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

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

匹配部分应替换为;

对于开头部分,正则表达式应为:

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

应该用空字符串替换。