簡體   English   中英

模式,Java中的匹配器,REGEX幫助

[英]Pattern, matcher in Java, REGEX help

我試圖從文本文件中刪除重復的連續單詞,有人提到我可以做這樣的事情:

Pattern p = Pattern.compile("(\\w+) \\1");
StringBuilder sb = new StringBuilder(1000);
int i = 0;
for (String s : lineOfWords) { // line of words is a List<String> that has each line read in from txt file
Matcher m = p.matcher(s.toUpperCase());
// and then do something like
while (m.find()) {
  // do something here
}

我試着查看m.end以查看是否可以創建新字符串,或者刪除匹配項的項目,但在閱讀文檔后我不確定它是如何工作的。 例如,作為一個測試案例,看看它是如何工作的,我做了:

if (m.find()) {
System.out.println(s.substring(i, m.end()));
    }

對於具有以下內容的文本文件: This is an example example test test test.

為什么我的輸出This is

編輯:

如果我有一個AraryList lineOfWords從.txt文件的行讀取每一行,然后我創建一個新的ArrayList來保存修改后的字符串。 例如

List<String> newString = new ArrayList<String>();
for (String s : lineOfWords { 
   s = s.replaceAll( code from Kobi here);
   newString.add(s);
} 

但是它不會給我新的s,而是原來的s。 是因為淺拷貝和深拷貝?

嘗試類似的東西:

s = s.replaceAll("\\b(\\w+)\\b(\\s+\\1)+\\b", "$1");

那個正則表達式比你的強一點 - 它檢查整個單詞(沒有部分匹配),並且去掉任意數量的連續重復。
正則表達式捕獲第一個單詞: \\b(\\w+)\\b ,然后嘗試匹配該單詞的空格和重復: (\\s+\\1)+ 最后的\\b是為了避免\\1部分匹配,如"for formatting"

第一場比賽是“這一個例子......”,所以m.end()指向第二個“是”的結尾。 我不確定為什么你用i作為起始索引; 嘗試m.start()代替。

要改進正則表達式,請在單詞前后使用\\b表示應該有單詞邊界: (\\\\b\\\\w+\\\\b) 否則,正如您所看到的,您將獲得內容匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM