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

标签 java regex

我尝试创建一个正则表达式来捕获两个捕获组之间的 token 。

输入示例

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 方法。我的问题是我不确定如何处理前面没有编号的行。该代码当前可以正确处理前面有编号的行,但是那些前面没有编号的行将不匹配。

任何人都可以为我提供一个正则表达式来处理编号前面的行或前面没有编号的行吗?我对任何正则表达式解决方案持开放态度,并且我不喜欢当前的正则表达式,因此请随意更改它。任何可以帮助我了解更多有关正则表达式的附带解释也将受到赞赏。

最佳答案

由于您使用捕获组,因此不需要环视。我会将后向更改为交替,以匹配编号或前导可选空格:

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

查看here on Regexr

交替的顺序在这里很重要。您需要将编号作为第一个替换,因为第二个替换将始终匹配。

您还可以使用此跳过前瞻和惰性量词

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

查看here on Regexr

关于java - 使用正则表达式从字符串中删除可选编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14086404/

相关文章:

java - 偏好 API 存储

java - 有没有办法在 HTML 代码不公开的页面上使用 Selenium?

java - Hibernate 要求 javax.validation.constraints.Size 进行枚举

javascript - 在从 CFC 返回结果之前对 AJAX 查询执行字符串函数

regex - grep 与正则表达式的电话号码

java - 计算 "for loop"中的数字并返回 java 中的平均值、最小值、最大值

java - IBM-Worklight : Failed starting project

c++ - 将 tr1::regex 与 unicode 字符串一起使用时出现问题

java - struts.action.excludePattern 不工作

regex - 正则表达式只接受单词之间的空格