Java RegEx - Регулярное выражение для разделения абзаца с началом и концом - PullRequest
2 голосов
/ 10 ноября 2009

Я новичок в Java Regex. Пожалуйста, помогите мне. Рассмотрим следующий абзац,

Абзац:

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

Мне нужно разбить вышеприведенный абзац как блоки текста, начиная с имени и заканчивая !!! , Здесь я не хочу использовать !!! как единственный разделитель для разделения абзаца. Мне нужно включить начальную последовательность (Имя) также в мое регулярное выражение.

то есть, мой результат API должен выглядеть как SplitAsBlocks («Абзац», «начинается с имени», «заканчивается с !!! ")

Как этого добиться, пожалуйста, помогите мне ...

Теперь я хочу получить тот же вывод, что и для Брито ... но здесь я добавил имя после "hsajdjah". Здесь он разделил текст следующим образом:

Name
ggggggggg
!!!

но мне нужно

Name abc
sadghsagh
hsajdjah Name
ggggggggg
!!!

то есть я должен сопоставить Имя, которое находится в начале строки, а не в середине.

пожалуйста, предложите мне ...

Барт ... см. Приведенный ниже регистр ввода для вашего кода ...

Мне нужно разделить следующее, используя ur API с параметром start => Name и end =>! Но результат варьируется .. у меня только 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
!

Здесь мне нужно иметь только Имя в начале строки, а не в середине ... Как добавить регулярное выражение для этого ...

Ответы [ 3 ]

4 голосов
/ 10 ноября 2009

Попробуйте:

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);
        }
    }
}
3 голосов
/ 10 ноября 2009
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 голосов
/ 10 ноября 2009

Следующее также следует делать, если вы хотите сохранить в результатах Name и !!!.

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

Редактировать : вот исправленная версия:

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

Это разделит все пробелы между !!! и Name и ничего больше; сохраняя обе части. Если вы не хотите делить на !!!Name, замените \\s* на \\s+, чтобы разрешить совпадение один-ко-многим вместо совпадения ноль-ко-многим.

Edit2 : прикреплен пример ввода / вывода. Входные данные скопированы из темы:

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
!
---------------------------------

выглядит хорошо?

...