比方說,我有這樣的事情:有沒有辦法指定一個正則表達式不符合其他任何一個?
pattern = new Pattern[6];
pattern[0] = Pattern.compile("^\\s*(NAME\\:\\s*)\\s(\\w+)");
pattern[1] = Pattern.compile("^\\s*(AGE\\:\\s*)\\s(\\d+)");
pattern[2] = Pattern.compile("^\\s*(ADDRESS\\:\\s)(\\w+)");
pattern[3] = Pattern.compile("^\\s*(BIRTHDAY\\:\\s)(\\d+)\\:(\\d+)\\:(\\d+)");
pattern[4] = Pattern.compile("(?=\\s*\\*)(^\\**)");
pattern[5] = Pattern.compile("\\S+|[^\\s*.+\\s*]");
模式4的點是捕獲的意見,然後*和模式5是捕捉一切,其他模式不能。然後Matcher dp將檢查該模式是否是從LookAhead返回true或false的預期模式。
public boolean lookAhead() {
while ((line = buff.readLine()) != null) {
Pattern different = Pattern.compile("^[^(\\s*NAME.*)(\\s*AGE.*)(\\s*ADDRESS.*)(\\s*BIRTHDAY.*)]");
Matcher comment = pattern[4].matcher(line);
Matcher diff = different.matcher(line);
Matcher name = pattern[0].matcher(line);
if (comment.find() || different.find() /*|| name.find()*/)
continue;
Matcher dp = pattern[0].matcher(line);
dpla = dp.find();
break;
}
}
return dpla;
}
該評論被忽略,所有的隨機錯誤,如:「feifiejfie」也是。但是,如果文本類似「名稱7987997 GSGSGE 456」,則應將其視爲錯誤,但不是。如果name.find未註釋,它將始終有效,但不會返回false。
也許你應該在也可以說你的輸入變量有多少**有效;以及你的代碼應該在做什麼。我很難從你的正則表達式中扣除這個邏輯。這已經給出了一點提示,說明你的當前代碼不太容易閱讀。意思是:我認爲這裏的解決方案是通過專注於你真正想知道的關於你的輸入的東西來大幅改進你的代碼。因此:請澄清您的要求。 – GhostCat
'模式[4]'看起來不對我。它與「在輸入開始時的一個或多個星號相匹配」,並且大多數前瞻是毫無意義的;這相當於'「^ \\ * +」' – Bohemian
備案:如果我的回答對你有幫助,請告訴我;或者如果有什麼遺漏...... – GhostCat