[英]Capturing group eat some characters
我的輸入是這樣的:
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我不明白為什么正則表達式會吃掉每個字符的開頭? 有人可以幫我解決這個問題嗎?
因為您在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()) {
由於表達式的捕獲部分在“吃東西” .*
表達式之前和之后,因此,您希望捕獲的部分內容最終被這些“填充符”占用。
您可以明確要求[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所有 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.