如何在Java中使用正则表达式分离文本?

如何在Java中使用正则表达式分离文本?,java,regex,Java,Regex,我正在寻找如何在java中分离地图中的文本。 例如,我有以下文本: 2.10将nodev选项添加到可移动媒体分区(评分)配置文件描述:将nodev设置为可移动 用于防止出现字符和阻止特殊设备的介质 ,在可移动媒体上,不被视为设备文件 因此,我使用正则表达式编写了以下代码: String text ="2.10 Add nodev Option to Removable Media Partitions (Scored)" +"Profile Descr

我正在寻找如何在java中分离地图中的文本。 例如,我有以下文本:

2.10将nodev选项添加到可移动媒体分区(评分)配置文件描述:将nodev设置为可移动 用于防止出现字符和阻止特殊设备的介质 ,在可移动媒体上,不被视为设备文件

因此,我使用正则表达式编写了以下代码:

    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\) ).*$
      

      (?我会使用一个正则表达式来表示段落的三个部分,同时将它们分组到各自的捕获组中:

      ((\d+(?:\.\d+)?)?.*\(Scored\))\n?(.*)
      
      与DOTALL标志一起使用,因此

      Pattern.compile("((\\d+(?:\\.\\d+)?)?.*\\(Scored\\))\\n?(.*)", Pattern.DOTALL)
      
      第一组是标题,第二组是标题开头的数字,第三组是段落正文

      我添加了一个
      \n?
      以删除正文的前导换行符


      你可以试试,也可以试试。

      我会使用一个正则表达式来表示段落的三个部分,同时将它们分组到各自的捕获组中:

      ((\d+(?:\.\d+)?)?.*\(Scored\))\n?(.*)
      
      与DOTALL标志一起使用,因此

      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
      。由于实际上没有行分隔符,您打算如何确定标题的结尾和段落的开头?我想在不使用
      \n
      的情况下分隔文本,例如,如果行中包含单词“(得分)”,因此我们将只考虑这一行的内容:2.10将nodev选项添加到可移动媒体(计分)请,您能更好地解释什么确切地决定键和描述吗?是字符串“(计分)”始终标记键结束,还是“\n”也可以标记键结束?描述可以跨多行(用“\n”分隔)描述是否总是以新行开始?每个标题以关键字“(Socred)”结尾段落的描述以新行开始。您将
      文本
      拆分为
      \n
      ,但
      文本
      没有
      \n
      。由于实际上没有行分隔符,您计划如何确定标题和段落的起始位置?我想在不使用
      \n
      的情况下分隔文本,例如,如果ne包含单词“(Scored)”,因此我们将只接受这一行的内容:2.10将nodev选项添加到Removable