2009-11-10 80 views
2

我是新來的java正則表達式。請幫助我。 考慮下面的段落,Java正則表達式 - 以開始和結束分割段落的正則表達式

段落:

  Name abc 
      sadghsagh 
      hsajdjah Name 
      ggggggggg 
      !!! 
      Name ggg 
      dfdfddfdf Name 
      !!! 
      Name hhhh 
      sahdgashdg Name 
      asjdhjasdh 
      sadasldkalskd 
      asdjhakjsdhja 
      !!! 

我需要拆分上述段落開頭名稱的文本塊和結尾! 。在這裏,我不想使用!作爲分割段落的唯一分隔符。我需要在我的正則表達式中包含起始序列(Name)。

即,我的成績API應該看起來像SplitAsBlocks( 「段落」, 「startswith名稱」, 「的endsWith !!!」)

如何實現這一點,請誰能幫我...

現在我想爲布里託給予相同的輸出...但在這裏我有「hsajdjah」之後添加名稱。這裏是分割文本beow:

Name 
ggggggggg 
!!! 

,但我需要

Name abc 
sadghsagh 
hsajdjah Name 
ggggggggg 
!!! 

這是我必須匹配名稱是在行的開始,而不是在中間。

請建議我...

巴特......看到下面的輸入情況下,爲您的代碼...

我需要拆分以下使用UR API啓動參數=>名稱和結束=>! 但輸出變化..我只有3個塊開始與名稱和結束! 。 我也附加了輸出。

String myInput = "Name hhhhh class0"+ "\n"+ 
        "HHHHHHHHHHHHHHHHHH"+ "\n"+ 
        "!"+ "\n"+ 
        "Name TTTTT TTTT"+ "\n"+ 
        "GGGGGG UUUUU IIII"+ "\n"+ 
        "!"+ "\n"+ 
        "Name JJJJJ WWWW"+ "\n"+ 
        "IIIIIIIIIIIIIIIIIIIII"+ "\n"+ 
        "!"+ "\n"+ 
        "RRRRRRRRRRR TTTTTTTT"+ "\n"+ 
        "HHHHHH"+ "\n"+ 
        "JJJJJ 1 Name class1"+ "\n"+ 
        "LLLLL 5 Name class5"+ "\n"+ 
        "!"+ "\n"+ 
        "OOOOOO HHHH FFFFFF"+ "\n"+ 
        "service 0 Name class12"+ "\n"+ 
        "!"+ "\n"+ 
        "JJJJJ YYYYYY 3/0"+ "\n"+ 
        "KKKKKKK"+ "\n"+ 
        "UUU UUU UUUUU"+ "\n"+ 
        "QQQQQQQ"+ "\n"+ 
         "!"; 
    String[] tokens = tokenize(myInput, "Name", "!"); 
    int n = 0; 
    for(String t : tokens) { 
     System.out.println("---------------------------\n"+(++n)+"\n"+t); 
    } 

輸出:

--------------------------- 
1 
Name hhhhh class0 
HHHHHHHHHHHHHHHHHH 
! 
--------------------------- 
2 
Name TTTTT TTTT 
GGGGGG UUUUU IIII 
! 
--------------------------- 
3 
Name JJJJJ WWWW 
IIIIIIIIIIIIIIIIIIIII 
! 
--------------------------- 
4 
Name class1 
LLLLL 5 Name class5 
! 
--------------------------- 
5 
Name class12 
! 

在這裏,我需要在該行的開始只有名稱不能在中間...... 如何添加正則表達式這個...

+0

請使用四個空格縮進代碼塊。 – Gumbo 2009-11-10 09:56:42

+0

??? '姓名abc sadghsagh hsajdjah姓名ggggggggg !!!'正是您在嘗試我的建議時所得到的結果。你有沒有嘗試我的建議?我在演示中調整了輸入,當你運行它時,你會看到它產生你剛剛描述的輸出。 – 2009-11-10 13:11:34

+0

是巴特我試過你的建議,它工作正常,但對特定情況失敗..我已經在上面的代碼中添加了特定的輸入案例..請參閱... – Sidharth 2009-11-10 13:55:24

回答

4

嘗試:

import java.util.*; 
import java.util.regex.*; 

public class Main { 

    public static String[] tokenize(String text, String start, String end) { 
     // old line: 
     //Pattern p = Pattern.compile("(?s)"+Pattern.quote(start)+".*?"+Pattern.quote(end)); 
     // new line: 
     Pattern p = Pattern.compile("(?sm)^"+Pattern.quote(start)+".*?"+Pattern.quote(end)+"$"); 

     Matcher m = p.matcher(text); 
     List<String> tokens = new ArrayList<String>(); 
     while(m.find()) { 
      tokens.add(m.group()); 
     } 
     return tokens.toArray(new String[]{}); 
    } 

    public static void main(String[] args) { 
     String text = "Name abc" + "\n" + 
      "sadghsagh"   + "\n" + 
      "hsajdjah Name"  + "\n" + 
      "ggggggggg"   + "\n" + 
      "!!!"    + "\n" + 
      "Name ggg"   + "\n" + 
      "dfdfddfdf Name"  + "\n" + 
      "!!!"    + "\n" + 
      "Name hhhh"   + "\n" + 
      "sahdgashdg Name" + "\n" + 
      "asjdhjasdh"   + "\n" + 
      "sadasldkalskd"  + "\n" + 
      "asdjhakjsdhja"  + "\n" + 
      "!!!"; 
     String[] tokens = tokenize(text, "Name", "!!!"); 
     int n = 0; 
     for(String t : tokens) { 
      System.out.println("---------------------------\n"+(++n)+"\n"+t); 
     } 
    } 
} 
+0

不應該是'/ Name | !!! /'嗎? – Kobi 2009-11-10 09:59:43

+0

謝謝Bart .. 我需要姓名和!!!在我最後的字符串中。 我的條件是同時使用名稱和!分割字符串不使用名稱或!!! 。 – Sidharth 2009-11-10 10:03:05

+0

@Kobi:不,在Java中,你不會在你的正則表達式中使用分隔符。在這件事上不要混淆Java和JavaScript! – 2009-11-10 10:05:15

3
String s = "Name abc sadghsagh hsajdjah !!! Name ggg dfdfddfdf !!! Name hhhh sahdgashdg asjdhjasdh sadasldkalskd asdjhakjsdhja !!!!! "; 
String startsWith = "Name"; 
String endsWith = "!!!"; 

// non-greedily get all groups starting with Name and ending with !!! 
String pattern = String.format("(%s).*?(%s)", Pattern.quote(startsWith), Pattern.quote(endsWith)); 
System.out.println(pattern); 

Matcher m = Pattern.compile(pattern, Pattern.DOTALL).matcher(s); 
while (m.find()) 
    System.out.println(m.group()); 

輸出:

(\QName\E).*?(\Q!!!\E) 
Name abc sadghsagh hsajdjah !!! 
Name ggg dfdfddfdf !!! 
Name hhhh sahdgashdg asjdhjasdh sadasldkalskd asdjhakjsdhja !!! 
+0

請注意,默認情況下,DOT不符合換行符。另外,如果OP希望「拆分」的子字符串包含正則表達式元字符,那麼事情就會出錯。最後,'group()'和'group(0)'是一樣的,但這只是眼睛。 – 2009-11-10 10:13:52

+0

謝謝Sfussenegger .... 上述解決方案工作正常,如果字符串s是單行...但在我的情況下,它是一個段落即ie。,每個單詞後有一個新的行字符...請如何拆分這..幫我.. – Sidharth 2009-11-10 10:18:27

+0

你可以添加標誌s(單行模式)以使新行匹配的Dotall運算符(。)相關行將是 Matcher m = Pattern.compile(pattern,Pattern .DOTALL).matcher(一個或多個); – squiddle 2009-11-10 10:35:47

0

下也應該,如果你想保持在結果都Name!!!做。

String [] parts = string.split(「(?=(Name | !!!))」);

編輯:這裏的修正版本:

String[] parts = string.split("(?<=!!!)\\s*(?=Name)"); 

這將各執!!!Name,沒有別的之間的任何空白;特此保留兩部分。如果您不想分割!!!Name,則將\\s*替換爲\\s+以允許一對多匹配而不是零對多匹配。

編輯2:附上了一個輸入/輸出的例子。輸入從topicstart複製:

String string = "Name hhhhh class0" + "\n" + "HHHHHHHHHHHHHHHHHH" + "\n" + "!" + "\n" 
    + "Name TTTTT TTTT" + "\n" + "GGGGGG UUUUU IIII" + "\n" + "!" + "\n" 
    + "Name JJJJJ WWWW" + "\n" + "IIIIIIIIIIIIIIIIIIIII" + "\n" + "!" + "\n" 
    + "RRRRRRRRRRR TTTTTTTT" + "\n" + "HHHHHH" + "\n" + "JJJJJ 1 Name class1" + "\n" 
    + "LLLLL 5 Name class5" + "\n" + "!" + "\n" + "OOOOOO HHHH FFFFFF" + "\n" 
    + "service 0 Name class12" + "\n" + "!" + "\n" + "JJJJJ YYYYYY 3/0" + "\n" + "KKKKKKK" 
    + "\n" + "UUU UUU UUUUU" + "\n" + "QQQQQQQ" + "\n" + "!"; 

String[] parts = string.split("(?<=!)\\s*(?=Name)"); 
for (String part : parts) { 
    System.out.println(part); 
    System.out.println("---------------------------------"); 
} 

輸出:

Name hhhhh class0 
HHHHHHHHHHHHHHHHHH 
! 
--------------------------------- 
Name TTTTT TTTT 
GGGGGG UUUUU IIII 
! 
--------------------------------- 
Name JJJJJ WWWW 
IIIIIIIIIIIIIIIIIIIII 
! 
RRRRRRRRRRR TTTTTTTT 
HHHHHH 
JJJJJ 1 Name class1 
LLLLL 5 Name class5 
! 
OOOOOO HHHH FFFFFF 
service 0 Name class12 
! 
JJJJJ YYYYYY 3/0 
KKKKKKK 
UUU UUU UUUUU 
QQQQQQQ 
! 
--------------------------------- 

看起來不錯?

+0

嗨BalusC,在這裏你使用或條件...但我需要使用和條件... – Sidharth 2009-11-10 12:49:35

+0

對不起,我錯過了這個關鍵點。我會盡快更新答案。 – BalusC 2009-11-10 13:30:04

+0

感謝BalusC,我已經測試過你的訣竅,但在這裏請用上面的輸入測試你的代碼,我在我的問題中解釋過。這裏的輸出有差別..請看看.. – Sidharth 2009-11-10 14:15:53