Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式-使用开始和结束拆分段落的正则表达式_Java_Regex_Split - Fatal编程技术网

Java正则表达式-使用开始和结束拆分段落的正则表达式

Java正则表达式-使用开始和结束拆分段落的正则表达式,java,regex,split,Java,Regex,Split,我不熟悉java正则表达式。请帮助我。 考虑下面的段落, 第段: Name abc sadghsagh hsajdjah Name ggggggggg !!! Name ggg dfdfddfdf Name !!! Name hhhh sahdgashdg N

我不熟悉java正则表达式。请帮助我。 考虑下面的段落,

第段:

            Name abc
            sadghsagh
            hsajdjah Name
            ggggggggg
            !!!
            Name ggg
            dfdfddfdf Name
            !!!
            Name hhhh
            sahdgashdg Name
            asjdhjasdh
            sadasldkalskd
            asdjhakjsdhja
            !!!
我需要将上面的段落拆分为以名称开头,以!!!结尾的文本块。这里我不想用!!!作为分割段落的唯一分隔符。我还需要在正则表达式中包含起始序列(名称)

例如,我的结果api应该看起来像SplitAsBlocks(“段落”、“带名称的开始”、“结束”) !!!)

如何做到这一点,请任何人帮助我

现在,我希望得到与Brito相同的输出…但在这里,我在“hsajdjah”之后添加了名称。在这里,它将文本拆分为beow:

Name
ggggggggg
!!!
但我需要

Name abc
sadghsagh
hsajdjah Name
ggggggggg
!!!
<>这是我必须匹配的名字,在行的开始,而不是在中间。

请建议我

巴特…请参阅下面的输入案例以了解您的代码

我需要使用带有参数start=>Name和end=>的URAPI拆分以下内容! 但是输出不同..我只有3个块,以Name开头,以!结尾。 我还附上了输出

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
!
在这里,我只需要在行首有名字,而不是在中间。。。 如何为此添加正则表达式…

请尝试:

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);
        }
    }
}
import java.util.*;
导入java.util.regex.*;
公共类主{
公共静态字符串[]标记化(字符串文本、字符串开始、字符串结束){
//老一套:
//模式p=Pattern.compile(“(?s)”+Pattern.quote(开始)+“*?”+Pattern.quote(结束));
//新行:
模式p=Pattern.compile(“(?sm)^”+Pattern.quote(start)+“*?”+Pattern.quote(end)+“$”;
匹配器m=p.Matcher(文本);
List tokens=new ArrayList();
while(m.find()){
添加(m.group());
}
返回tokens.toArray(新字符串[]{});
}
公共静态void main(字符串[]args){
String text=“Name abc”+“\n”+
“sadghsagh”+“\n”+
“hsajdjah名称”+“\n”+
“ggggggggg”+“\n”+
“!!!”+“\n”+
“名称ggg”+“\n”+
“DFDDFDF名称”+“\n”+
“!!!”+“\n”+
“名称hhh”+“\n”+
sahdgashdg名称“+”\n+
“asjdhjasdh”+“\n”+
“sadasldkalskd”+“\n”+
“asdjhakjsdhja”+“\n”+
"!!!";
String[]tokens=tokenize(文本,“Name”、“!!!”);
int n=0;
for(字符串t:令牌){
System.out.println(“-------------------------------\n”+(++n)+“\n”+t);
}
}
}
输出:

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

如果要同时保留
名称
,也应执行以下操作在结果中

String[]parts=String.split((?=(名称|!!!!!))”;

编辑:以下是更正的版本:

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

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


看起来不错?

请使用四个空格缩进表示代码块<代码>名称abc sadghsagh hsajdjah名称ggggggggg
正是您尝试我的建议时得到的结果。你试过我的建议了吗?我在我的演示中调整了输入,当你运行它时,你会看到它产生了你刚才描述的输出。。我在上面的代码中添加了特定的输入大小写。请看…请注意消息格式。欢迎
unknown
。你知道尽可能清楚地表达自己是多么重要吗?在这里(或公共论坛上的任何地方)提交下一个问题之前,请校对您的问题,看看您是否可以预览您的邮件在发布后的结局:格式也很重要。祝你好运。谢谢你,巴特。。我需要名字和名字!!!在我最后的弦之内。我的条件是同时使用名称和!!!要拆分字符串,请不要使用名称或@Kobi:不,在Java中,正则表达式周围不使用分隔符。在这件事上不要混淆Java和JavaScript!巴特非常感谢你的关心。。。您将文本定义为单行,如下所示。。。String text=“Name abc sadghsagh hsajdjah!!!Name ggg dfdfddfdf!!!Name hhh sahdgashdg asjdh sadashldkalskd asdjhakjsdhja!!!”;但是在我的例子中,每个单词都在一行中。请建议我如何拆分这类段落?你的意思是:
返回tokens.toArray(新字符串[tokens.size()])
?@Bart-抱歉,Java当然不支持这一点。我很困惑,这肯定是JavaScript。对不起,我不知道是怎么回事……请注意,默认情况下,点与换行符不匹配。此外,如果OP想要“拆分”的子字符串包含正则表达式元字符,则会出现问题。最后,
group()
group(0)
相同,但这只是一个漂亮的例子。。。。如果字符串s是单行,上面的解决方案很好…但在我的例子中,它是一个段落,即,每个单词后面都有一个新行字符。。。请告诉我如何拆分此..帮助我..您可以添加标志s(单行模式)以使新行由Dotall运算符(.)匹配。相关行将是Matcher m=Pattern.compile(Pattern,Pattern.Dotall).Matcher(s);特殊字符不应该是个问题,正如我建议使用处理特殊字符的
Pattern.quote(startsWith)
。此外,我还编辑了我的代码以使用
group()
Pattern.DOTALL
。在编辑答案之前,我发布了关于特殊字符的备注。您的第一个答案不包含
模式。quote(…)
's.Hi BalusC,这里是您正在使用的或条件。。。但我需要使用和条件…对不起,我错过了这个关键点。我会尽快更新答案。谢谢BalusC,我已经测试了你的技巧,但是这里请用我在问题中解释的上面的输入测试你的代码。这里的输出不同..请看..是的,但是上面的第三个输出在m中是错误的
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
!
---------------------------------