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