如何在Java中使用正则表达式分离文本?
我正在寻找如何在java中分离地图中的文本。 例如,我有以下文本: 2.10将nodev选项添加到可移动媒体分区(评分)配置文件描述:将nodev设置为可移动 用于防止出现字符和阻止特殊设备的介质 ,在可移动媒体上,不被视为设备文件 因此,我使用正则表达式编写了以下代码:如何在Java中使用正则表达式分离文本?,java,regex,Java,Regex,我正在寻找如何在java中分离地图中的文本。 例如,我有以下文本: 2.10将nodev选项添加到可移动媒体分区(评分)配置文件描述:将nodev设置为可移动 用于防止出现字符和阻止特殊设备的介质 ,在可移动媒体上,不被视为设备文件 因此,我使用正则表达式编写了以下代码: String text ="2.10 Add nodev Option to Removable Media Partitions (Scored)" +"Profile Descr
String text ="2.10 Add nodev Option to Removable Media Partitions (Scored)"
+"Profile Description:Set nodev on removable media to prevent character and "
+"block special devices that are present"
+", on the removable media from being treated as device files. ";
Map<String, List<String>> maps = new HashMap<>();
Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$"); //To find out if there is, for example, 1.1.
Pattern pattern2 = Pattern.compile("[0-9].*?.*[0-9].*$");//To retrieve the title of the paragraph: 1.1. Add Nodev Option to Removable Media Scores
List<String> paragraphe = new ArrayList<>();
maps.put(null, paragraphe);
for(String ligne : text.split("\n")) {
Matcher matcher = pattern.matcher(ligne);
Matcher matcher2 = pattern2.matcher(ligne);
if ( matcher.matches() && matcher2.matches()) {
paragraphe = new ArrayList<>();
maps.put( matcher2.group(0), paragraphe);
paragraphe.add(ligne);
}
else {
paragraphe.add(ligne);
}
}
for (Entry<String, List<String>> key : maps.entrySet()) {
for (String strings : key.getValue()) {
if (strings.contains("(Scored)")) {
System.out.println("Key : " + key.getKey() + " Value : " + key.getValue());
}
}
}
String text=“2.10将nodev选项添加到可移动媒体分区(已评分)”
+“配置文件说明:在可移动媒体上设置nodev以防止字符和”
+“阻止存在的特殊设备”
+“,在可移动媒体上,不被视为设备文件。”;
Map maps=新的HashMap();
Pattern=Pattern.compile(“^(\\d+\\)*?(\\d+))。*$”//找出是否存在,例如,1.1。
Pattern pattern2=Pattern.compile(“[0-9].*?*[0-9].*$”)//检索段落标题:1.1。将Nodev选项添加到可移动媒体分数
列表段落=新建ArrayList();
maps.put(空,段落);
对于(字符串ligne:text.split(“\n”){
Matcher-Matcher=pattern.Matcher(ligne);
Matcher matcher2=pattern2.Matcher(ligne);
if(matcher.matches()&&matcher2.matches()){
段落=新的ArrayList();
maps.put(matcher2.group(0),段落);
第段。添加(对齐);
}
否则{
第段。添加(对齐);
}
}
for(输入键:maps.entrySet()){
for(字符串:key.getValue()){
if(strings.contains(“(Scored)”){
System.out.println(“Key:+Key.getKey()+”值:+Key.getValue());
}
}
}
此代码显示以下结果:
键:2.10将nodev选项添加到可移动媒体分区(已评分)
值:[2.10将nodev选项添加到可移动媒体分区(评分)
配置文件说明:在可移动媒体上设置nodev以防止字符丢失
并阻止可移动介质上存在的特殊设备
不会被视为设备文件。]
但我希望得到以下结果:包含标题(2.10将nodev选项添加到可移动媒体分区(评分))及其内容值(配置文件描述:将nodev设置为可移动……)的密钥:
键:2.10将nodev选项添加到可移动媒体分区(已评分)
值:[
配置文件说明:在可移动媒体上设置nodev以防止字符丢失
并阻止可移动介质上存在的特殊设备
不会被视为设备文件。]
有人可以帮我得到正确的结果。
谢谢如果(评分)
是标题中的最后一个单词,后面的文本是段落,则将正则表达式模式更改为:
- 标题:
在末尾添加了^((\d+\.)*?(\d+)).*\(Scored\)
,以确保标题以\(得分)
(得分)
- 本段:
(?<=\(Scored\) ).*$
(?如果
是标题中的最后一个单词,后面的文本是段落,则将正则表达式模式更改为:(评分)
- 标题:
在末尾添加了^((\d+\.)*?(\d+)).*\(Scored\)
,以确保标题以\(得分)
(得分)
- 本段:
(?<=\(Scored\) ).*$
(?我会使用一个正则表达式来表示段落的三个部分,同时将它们分组到各自的捕获组中:
与DOTALL标志一起使用,因此((\d+(?:\.\d+)?)?.*\(Scored\))\n?(.*)
第一组是标题,第二组是标题开头的数字,第三组是段落正文 我添加了一个Pattern.compile("((\\d+(?:\\.\\d+)?)?.*\\(Scored\\))\\n?(.*)", Pattern.DOTALL)
以删除正文的前导换行符\n?
你可以试试,也可以试试。我会使用一个正则表达式来表示段落的三个部分,同时将它们分组到各自的捕获组中:
与DOTALL标志一起使用,因此((\d+(?:\.\d+)?)?.*\(Scored\))\n?(.*)
第一组是标题,第二组是标题开头的数字,第三组是段落正文 我添加了一个Pattern.compile("((\\d+(?:\\.\\d+)?)?.*\\(Scored\\))\\n?(.*)", Pattern.DOTALL)
以删除正文的前导换行符\n?
您可以试用它,也可以使用。解决方案是替换以下行:
由Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$");
Pattern.compile("((\\d+(?:\\.\\d+)?)?.*\\(Scored\\))\\n?(.*)", Pattern.DOTALL)
解决方案是更换以下线路:
由Pattern pattern = Pattern.compile("^((\\d+\\.)*?(\\d+)) .*$");
Pattern.compile("((\\d+(?:\\.\\d+)?)?.*\\(Scored\\))\\n?(.*)", Pattern.DOTALL)
您使用
拆分\n
,但是文本
没有文本
。由于实际上没有行分隔符,您打算如何确定标题的结尾和段落的开头?我想在不使用\n
的情况下分隔文本,例如,如果行中包含单词“(得分)”,因此我们将只考虑这一行的内容:2.10将nodev选项添加到可移动媒体(计分)请,您能更好地解释什么确切地决定键和描述吗?是字符串“(计分)”始终标记键结束,还是“\n”也可以标记键结束?描述可以跨多行(用“\n”分隔)描述是否总是以新行开始?每个标题以关键字“(Socred)”结尾段落的描述以新行开始。您将\n
拆分为文本
,但\n
没有文本
。由于实际上没有行分隔符,您计划如何确定标题和段落的起始位置?我想在不使用\n
的情况下分隔文本,例如,如果ne包含单词“(Scored)”,因此我们将只接受这一行的内容:2.10将nodev选项添加到Removable\n
- 标题: