使用正则表达式从字符串中删除可选编号

时间:2012-12-29 22:17:32

标签: java regex

我尝试创建一个将在两个捕获组之间捕获令牌的正则表达式。

示例输入

Added experiencevalidator [Java] [Spring]
1.  Added validators [Java] [Spring]
2.  Fixed issues with deletes [JPA] [Java]

基本上我想在编号(1.,2。)和标签([Java] [Spring])之间捕获令牌。

预期捕获

匹配器应为每条线返回以下内容:

Added experiencevalidator
Added validators
Fixed issues with deletes

我目前正在使用此代码,该代码利用积极的前瞻和外观。

private Pattern TITLE_REGEX = Pattern.compile("(?<=\\d\\.\\s)(.*?)(?=\\[.*)");

private String cleanseTitle(String title){
    Matcher m = TITLE_REGEX.matcher(title);
    if(m.find()){
        System.out.println("Match found");
        System.out.println(m.group(1));;
    }else{
        System.out.println("No Match");
    }
    return title;
}

每一行都通过title参数传递给cleanseTitle方法。我的问题是我不知道如何处理没有编号的行。代码当前处理前面正确编号的行,但是没有编号的行返回不匹配。

任何人都可以向我提供一个正则表达式,它将处理前面带编号的行或不带编号的行吗?我对任何正则表达式解决方案持开放态度,我不喜欢我当前的正则表达式,所以随时可以改变它。任何随附的解释都可以帮助我了解有关正则表达式的更多信息。

3 个答案:

答案 0 :(得分:1)

您可以使用两个正则表达式:

  1. 无任何替换^\d+\.\s+
  2. 无任何替换(\s+\[[^]]+\])*\s*$
  3. 当然,不要忘记将Java字符串中的所有反斜杠加倍。

    请注意,您不需要测试匹配项:如果正则表达式不匹配,则不会进行替换。

    示例代码:

    private static final String
        BEGINNING_NUMBERS = "^\\d+\\.\\s+",
        ENDING_TOKENS = "(\\s+\\[[^]]+\\])*\\s*$";
    
    private String cleanseTitle(String title)
    {
        return title.replaceFirst(BEGINNING_NUMBERS, "")
            .replaceFirst(ENDING_TOKENS, "");
    }
    

答案 1 :(得分:1)

只修复你的正则表达式而不是写一个新的正则表达式,你在开始时匹配一个数字。为什么不选择它。

(?<=\\d\\.\\s)?(.*?)(?=\\[.*)

答案 2 :(得分:1)

由于您使用捕获组,因此您不需要使用外观。我会将lookbehind更改为替换,以匹配编号或前导可选空格:

^(?:\d+\.\s|\s*)(.*?)(?=\[.*)

here on Regexr

交替中的顺序非常重要。您需要将编号作为第一个替换,因为第二个替代将始终匹配。

您可以使用此

跳过前瞻和延迟量词
^(?:\d+\.\s|\s*)([^\[]+)

here on Regexr