我試圖開發一個正則表達式來查找字符串內的標記序列。例如,我可以將標記(NP .*)
至少一次(可以是多次),然後是標點符號(在此例中爲./.
)。如果在(NP)
和./.
之間還有另一個標記(如下面例子中的VP),Matcher一定不能找到任何東西。問題是,即使在.*
之後使用問號,它也會繼續查找)
,從而使表達式匹配字符串中的某些內容。這裏是我的方法:Java上的正則表達式:避免Matcher類不必要的「貪婪」策略
public void myMethod() {
String input = "(NP first tag) (VP second tag) ./.";
String regex = "(\\(NP .*?\\)()?)+" + "\\./\\.";
Pattern pattern = Pattern.compile("(" + regex + ")");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
System.out.println("<S "+matcher.group(0)+">");
} else {
System.out.println("sem grupos.");
}
}
該方法仍然會匹配正則表達式,但它不應該。我需要它告訴我沒有發現任何組,因爲「VP」標籤不應該在那裏。我相信這個問題依賴於Java中的正則表達式所採用的貪婪策略。它試圖找到一些與正則表達式相關的字符組合。我不知道如何重寫這個表達式。
任何幫助?
編輯:
1)我注意到,我的問題是有點混亂,所以我改變了一下讓它能夠更清晰。
2)謝謝Aan Moore。我同意我使用的組數多於必要數量,但是這是因爲像+
這樣的運營商。我試圖砍掉不必要的羣體。另外你的簡單想法是用[^)]*?
代替.*?
太棒了!我唯一調整的是我通過使用[^\\)]*?
逃脫)
符號。下面我顯示最後使用的REGEX。
String regex = "(\\(NP [^\\)]*?\\) ?)+\\./\\.";
非常感謝! :)
你只想兩個標籤有: - 'NP'和'VP'?你實際上並不符合你的'VP'標籤? –