我試圖以匹配所有包含符號<
或>
令牌,但也有一些衝突。特別是,我的令牌是<
,>
,</
,/>
,以及以<!--
開始並以-->
結束的評論。是正則表達式匹配的衝突重疊符號
我對這些正則表達式如下:
String LTHAN = "<";
String GTHAN = ">";
String LTHAN_SLASH = "</";
String GTHAN_SLASH = "/>";
String COMMENT = "<!--.*-->";
而且我用的一般方法,將它們添加到列表編譯它們:
public void add(String regex, int token) {
tokenInfos.add(new TokenInfo(Pattern.compile("^(" + regex + ")"), token));
}
這裏是我的TokenInfo類的樣子:
private class TokenInfo {
public final Pattern regex;
public final int token;
public TokenInfo(Pattern regex, int token) {
super();
this.regex = regex;
this.token = token;
}
}
我匹配並顯示如下列表:
public void tokenize(String str) {
String s = new String(str);
tokens.clear();
while (!s.equals("")) {
boolean match = false;
for (TokenInfo info : tokenInfos) {
Matcher m = info.regex.matcher(s);
if (m.find()) {
match = true;
String tok = m.group().trim();
tokens.add(new Token(info.token, tok));
s = m.replaceFirst("");
break;
}
}
}
}
讀取和顯示:
try {
BufferedReader br;
String curLine;
String EOF = null;
Scanner scan = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
try {
File dir = new File("C:\\Users\\Me\\Documents\\input files\\example.xml");
br = new BufferedReader(new FileReader(dir));
while ((curLine = br.readLine()) != EOF) {
sb.append(curLine);
// System.out.println(curLine);
}
br.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
tokenizer.tokenize(sb.toString());
for (Tokenizer.Token tok : tokenizer.getTokens()) {
System.out.println("" + tok.token + " " + tok.sequence);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
樣品輸入:
<!-- Sample input file with incomplete recipe -->
<recipe name="bread" prep_time="5 mins" cook_time="3 hours">
<title>Basic bread</title>
<ingredient amount="3" unit="cups">Flour</ingredient>
<instructions>
<step>Mix all ingredients together.</step>
</instructions>
</recipe>
然而,輸出令牌列表識別<
和/
(包括任何字符來後話)作爲單獨的令牌,意思它似乎永遠不會識別令牌</
和/>
。與評論相同的問題。這是我的正則表達式的問題嗎?爲什麼它不識別模式</
和/>
?
希望我的問題是清楚的。如有需要,歡迎提供更多細節/示例。
它們是否按聲明的順序添加到列表中? – RamenChef
如果您嘗試解析HTML/XML,我建議使用現有的庫。 – 4castle
您可能想提及'TokenInfo'和'Pattern'的來源。 (假設oAuth&java.util,但是...可能是錯誤的) – Tibrogargan