我尝试创建一个将在两个捕获组之间捕获令牌的正则表达式。
示例输入
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
方法。我的问题是我不知道如何处理没有编号的行。代码当前处理前面正确编号的行,但是没有编号的行返回不匹配。
任何人都可以向我提供一个正则表达式,它将处理前面带编号的行或不带编号的行吗?我对任何正则表达式解决方案持开放态度,我不喜欢我当前的正则表达式,所以随时可以改变它。任何随附的解释都可以帮助我了解有关正则表达式的更多信息。
答案 0 :(得分:1)
您可以使用两个正则表达式:
^\d+\.\s+
,(\s+\[[^]]+\])*\s*$
。当然,不要忘记将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*)(.*?)(?=\[.*)
交替中的顺序非常重要。您需要将编号作为第一个替换,因为第二个替代将始终匹配。
您可以使用此
跳过前瞻和延迟量词^(?:\d+\.\s|\s*)([^\[]+)