我的输入是这样的:
line 1
**ER1.RIAA.SOMPSFIO(LIAOEE) UTGD788 FDSJOFUZZÄ line2
JNDJZSDS ER1.RIAA.SIMEDFUA(AUDD) YIRIHFIH1465EZZÄ
line 3
UJZRJOERERÃLDE,UIE='UJ1.DHZKZ5.OZDEZN98.AAERRE',I=DZEDE POPZEOE**
我想只获得带句点的字符,即:
ER1.RIAA.SOMPSFIO
ER1.RIAA.SIMEDFUA
UJ1.DHZKZ5.OZDEZN98.AAERRE
我的解决方案是:
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
nrligne++;
int counter = 0;
for (int i=0; i<line.length(); i++ ) {
if( line.charAt(i) == '.' ) {
counter++;
}
}
if (counter == 2) {
if (line.matches("^.*[A-Z0-9]+\\..[A-Z1-9]+.*$")){
line= removeTroublesomeCharacters(line);
System.out.println("ligne vaut "+line);
Pattern dsnPattern = Pattern.compile("^.*([A-Z0-9]+)\\..([A-Z1-9]+)\\..([A-Z1-9]+).*$");
Matcher m = dsnPattern.matcher(line);
if (m.matches()) {
String part1 = m.group(1);
String part2 = m.group(2);
String part3 = m.group(3);
System.out.println("part1 vaut "+part1);
System.out.println("part2 vaut "+part2);
System.out.println("part2 vaut "+part3);
}
}
目前结果是
ligne vaut ER1.RIAA.SOMPSFIO(LIAOEE) UTGD788
part1 vaut 1
part2 vaut IAA
part2 vaut OMPSFIO
ligne vaut PZFDSJOFUZZÃâ ER1.RIAA.SIMEDFUA(AUDD) UOOO88
part1 vaut 1
part2 vaut IAA
part2 vaut IMEDFUA
ligne vaut UJZRJOERERÃLDE,UIE='UJ1.DHZKZ5.OZDEZN98',I=DZEDE POPZEOE
part1 vaut 1
part2 vaut HZKZ5
part2 vaut ZDEZN98
输入中的文件:http://uploadhero.co/dl/PWBLhi7d 我不明白为什么正则表达式会吃掉每个角色的开头?有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
因为您在dot
之后消耗了额外的字符,而不是在字符类中包含它。
\\.. // this will match a dot, and then following single character.
另外,将正则表达式开头的.*
设为.*?
。由于量词在默认情况下是贪婪的,因此它们会消耗所有字符,只需在.
之前留下一个单词,以便与([a-z0-9]+)
匹配。
将正则表达式更改为:
"^.*?([A-Z0-9]+)\\.([A-Z1-9]+)\\.([A-Z1-9]+).*$"
另外,既然您正在使用Pattern
和Matcher
,我会考虑使用Matcher#find()
方法,并针对我需要的部分构建模式:
Pattern dsnPattern = Pattern.compile("([A-Z0-9]+)\\.([A-Z1-9]+)\\.([A-Z1-9]+)");
Matcher m = dsnPattern.matcher(line);
if (m.find()) {
答案 1 :(得分:1)
由于表达式的捕获部分之前和之后都是“吃任何东西”.*
表达式,因此您希望捕获的部分内容最终会被这些“填充程序”消耗。
您可以明确要求[A-Z0-9]+
组之前和之后的字符为非字母数字,如下所示:
"^.*(?<![A-Z0-9])([A-Z0-9]+)\\.([A-Z1-9]+)\\.([A-Z1-9]+)(?![A-Z1-9]).*$"
(?<![A-Z0-9])
表达式表示“前面没有[A-Z0-9]
”(?![A-Z1-9])
表达式表示“未跟[A-Z1-9]
”编辑:
前瞻不是必需的,因为+
是贪婪的:
"^.*(?<![A-Z0-9])([A-Z0-9]+)\\.([A-Z1-9]+)\\.([A-Z1-9]+).*$"
(归功于Rohit Jain)