2014-03-03 58 views
0

我在排除「#」符號後部分字符串時遇到了一些困難。JAVA-忽略包含「#」的字符串的一部分

我更好地解釋自己:

這是一個樣本輸入文本,用戶可以在一個文本框插入:

Some Text 
Some Text again #A comment 
#A comment line 
Another Text 
Another Text again#Comment 

我需要閱讀這篇文字後,忽略「#」符號的所有文本。

這應該是預期的輸出:

Some Text;Some Text again;Another Text;Another Text again 

至於現在這裏的代碼:

這將替換所有的換行「;」

readText = userInputTextArea.getText(); 
readTextAllInALine = readText.replaceAll("\\n", ";"); 

所以在這之後的輸出是:

Some Text;Some Text again #A comment;#A comment line;Another Text;Another Text again#Comment 

此代碼是忽略第一個「#」後的所有字符,但如果我們看它都相繼工作正常只是第一道防線。

int startIndex = inputCommandText.indexOf("#"); 
int endIndex = inputCommandText.indexOf(";"); 
String toBeReplaced = inputCommandText.substring(startIndex, endIndex); 
readTextAllInALine.replace(toBeReplaced, ""); 

我被困在尋找具有預期產出的方式。我正在考慮使用一個StringTokenizer,處理每一行,刪除「#」後面的文本,或者如果以「#」開頭,​​則忽略整行,然後打印所有用「;」分隔的標記(即所有行)。但我不能使它工作。

任何幫助將不勝感激。

非常感謝您提前。

問候。

+1

請註明您的編程語言 – Coxer

+0

對不起......現在固定的! – user2956655

回答

3

只需在您的純字符串上調用此替換命令,從文本輸入中檢索。正則表達式#[^;] *抓取所有內容,從散列開始,直到它讀取分號。之後,它用空字符串替換它。

public static void main(String[] args) { 
    String text = "Some Text;Some Text again #A comment;#A comment line;Another Text;Another Text again#Comment"; 
    System.out.println(text); 
    text = text.replaceAll("#[^;]*", ""); 
    System.out.println(text); 
} 
+0

該OP的評論是結束語評論,所以它不能正常工作。例如'Text #comment; Text;'將轉換爲'Text Text;'當它理想地應該是'Text; Text;'時。 – Radiodef

+0

字符串內部沒有換行符,因爲他已經用分號替換它們 – Coxer

+0

它工作正常!!非常感謝您的幫助! 正如之前的評論「文本#評論;文本;」輸出報道預期的'文本;文字' – user2956655

1

一個正則表達式在這裏很有用,但它很棘手,因爲你的模式比較複雜。評論是結束語,因此它們可以出現在多個安排中。

我想出了這是一個雙通道的情況如下:

replaceAll(" *(#.*(?=\\n|$))", "").replaceAll("\\n+", ";"); 

兩個通規避,有時你會得到一個重複的線路中斷的事實。第一個表達式替換註釋但不是換行符,第二個表達式用一個分號替換多個換行符。

在第一遍中表達的各個部件如下:

  • " *"

這包括在註釋匹配零個或多個前導空格。IE在"...again #A..."中,我們要刪除n#之間的空間。

  • "(#.*)"

評論比賽開始:匹配#後跟零個或多個字符。 (通常,.匹配除新行的任何字符)。

  • "(?=)

這是一個積極的前瞻以及其中正則表達式開始變得非常棘手。這看起來對什麼是這個表達式中,但不包括在多數民衆贊成匹配的文本,它聲稱,#.*其次是某些字符串,但不能取代某些字符串。

  • "\\n|$"

該向前查找新行結束錨點。這將發現以新行字符結束的註釋位於字符串末尾。但是,再次,因爲它在預見之內,所以新線不會被替換。

所以給出的輸入:

String text = (
    "Some Text" + '\n' + 
    "Some Text again #A comment" + '\n' + 
    "#A comment line" + '\n' + 
    "Another Text" + '\n' + 
    "Another Text again#Comment" 
); 

System.out.println(
    text.replaceAll(" *(#.*(?=\\n|$))", "").replaceAll("\\n+", ";") 
); 

輸出是:

 
Some Text;Some Text again;Another Text;Another Text again 
0

只是要清楚,Coxer的答覆是要走的路。更精確和乾淨。但在任何情況下,如果你看中這裏的實驗是一個遞歸的解決方案,將工作:

public class IgnoreHash { 
@Test 
public void test() { 
    String readTextAllInALine = "Some Text;Some Text again #A comment;#A comment line;Another Text;Another Text again#Comment;"; 
    String actualResult = removeHashComments(readTextAllInALine); 
    Assert.assertEquals(actualResult, "Some Text;Some Text again ;Another Text;Another Text again"); 

} 

private String removeHashComments(String input) { 
    StringBuffer result = new StringBuffer(); 
    int hashIndex = input.indexOf("#"); 
    int endIndex = input.indexOf(";"); 

    if(hashIndex != -1){ 
     result.append(input.substring(0, hashIndex)); 
     //first line 
     if(hashIndex < endIndex) { 
      result.append(removeHashComments(input.substring(endIndex))); 
     } // the case of ;# 
     else if (endIndex == hashIndex-1) { 
      int endIndex2 = input.indexOf(";", hashIndex+1); 
      result.append(removeHashComments(input.substring(endIndex2+1))); 
     } 
     else { 
      result.append(removeHashComments(input.substring(hashIndex))); 
     } 
    } 

    return result.toString(); 
} 

}

+0

只是好奇,爲什麼你會堅持平等的結果是錯的? OP表示他們的預期產出。 – Radiodef

+0

你是對的 - 我改變了答案來反映這一點。 – user1485864

+0

嗯,我想OP有追溯地說它沒關係,所以我不再運動。 – Radiodef

0
readText = userInputTextArea.getText(); 
readText = readText.replaceAll("\\s*#[^\n]*", ""); 
readText = readText.replaceAll("\n+", ";"); 
相關問題