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 - Fatal编程技术网

如何在java中捕获未完成行之间的文本

如何在java中捕获未完成行之间的文本,java,regex,Java,Regex,我已收到此文本(数值可能会更改): .START_顺序随机句子 3.40000 1 2 3 4是否有文本 4 3 8 9 .END_序列 我想得到以下文本(因此基本上可以找到.START\u序列和.END\u序列之间的所有内容,但既不包括START\u序列行的结尾,也不包括下一行) 1 2 3 4是否有文本 4 3 8 9 我玩过Pattern.DOTALL、Pattern.MULTILINE,设法摆脱了一些东西,但从来没有达到我想要的准确选择。我不知道如何继续前进 这是我最后一次尝试 fina

我已收到此文本(数值可能会更改):

.START_顺序随机句子
3.40000
1 2 3 4是否有文本
4 3 8 9
.END_序列

我想得到以下文本(因此基本上可以找到.START\u序列和.END\u序列之间的所有内容,但既不包括START\u序列行的结尾,也不包括下一行)

1 2 3 4是否有文本
4 3 8 9

我玩过Pattern.DOTALL、Pattern.MULTILINE,设法摆脱了一些东西,但从来没有达到我想要的准确选择。我不知道如何继续前进

这是我最后一次尝试

final String START_SEQUENCE = "\\.START_SEQUENCE[^\n^\r]*";
final String END_SEQUENCE = "\\.END_SEQUENCE";
Pattern regex = Pattern.compile(START_SEQUENCE+"(.*)"+END_SEQUENCE, Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(emn);
if (regexMatcher.find()) {
    String ResultString = regexMatcher.group(1);
}
结果是什么

3.40000
1 2 3 4是否有文本
4 3 8 9

非常感谢

将此正则表达式与标志一起使用:

解释
Pattern.UNIX\u行
使
等同于
[^\n]
。通常,它是
[^\n\r\u0085\u2028\u2029]

让我们对正则表达式进行分解(为了更易于阅读,已解析转义序列):


((?:(?!\.END\u序列)。*\n)*+)
匹配中间的其余行,并将结果放入捕获组1。通常,
((?:...\n)*?)
就足够了,但为了防止在大数据集上出现
堆栈溢出错误,我切换到所有格量词
*+
,需要检查
(?!\\.END\u序列)
,这样重复就可以在没有回溯的情况下完成。

不需要继续,但类似的事情,捕获组1包含感兴趣的数据

(?-s)\.START_SEQUENCE.*\n.*\n([\S\s]*?)\.END_SEQUENCE
非正则表达式解决方案:

import  java.util.ArrayList;
import  java.io.File;
import  java.io.IOException;
import  org.apache.commons.io.FileUtils;
import  org.apache.commons.io.LineIterator;

/**
   <P>{@code java BetweenLineMarkersButSkipFirstXmpl C:\java_code\\xbn\z\xmpl\text\regex\BetweenLineMarkersButSkipFirstXmpl_data.txt}</P>
**/
public class BetweenLineMarkersButSkipFirstXmpl  {
   public static final void main(String[] as_1RqdTxtFilePath)  {
      LineIterator li = null;
      try  {
         li = FileUtils.lineIterator(new File(as_1RqdTxtFilePath[0])); //Throws npx if null
      }  catch(IOException iox)  {
         throw  new RuntimeException("Attempting to open \"" + as_1RqdTxtFilePath[0] + "\"", iox);
      }  catch(RuntimeException rtx)  {
         throw  new RuntimeException("One required parameter: The path to the text file.", rtx);
      }

      String sLS = System.getProperty("line.separator", "\n");

      ArrayList<String> alsItems = new ArrayList<String>();
      boolean bStartMark = false;
      boolean bLine1Skipped = false;
      StringBuilder sdCurrentItem = new StringBuilder();
      while(li.hasNext())  {
         String sLine = li.next().trim();
         if(!bStartMark)  {
            if(sLine.startsWith(".START_SEQUENCE"))  {
               bStartMark = true;
               continue;
            }
            throw  new IllegalStateException("Start mark not found.");
         }  if(!bLine1Skipped)  {
            bLine1Skipped = true;
            continue;
         }  else if(!sLine.equals(".END_SEQUENCE"))  {
            sdCurrentItem.append(sLine).append(sLS);
         }  else  {
            alsItems.add(sdCurrentItem.toString());
            sdCurrentItem.setLength(0);
            bStartMark = false;
            bLine1Skipped = false;
            continue;
         }
      }

      for(String s : alsItems)  {
         System.out.println("----------");
         System.out.print(s);
      }
   }
}
输出:

[C:\java_code\]java BetweenLineMarkersButSkipFirstXmpl C:\java_code\BetweenLineMarkersButSkipFirstXmpl_data.txt
----------
1 2 3 4
4 3 8 9
----------
2 3 4 5
3 8 9 10

你确定第二行(3.40000)总是在那里吗?@nhahtdh是的,那里总是有一行可以跳过。@Jerry不,有时,我想选择的行在末尾包含文本。这很有效:)非常感谢你是第一个得到正确答案的人,但是nhahtdh评论了他的答案,所以我给了他支票,但你仍然值得我投票:)这很有效,非常感谢你的解释(我肯定需要处理这些?:!事情!)@Zzirconium:我的第一个答案缺少捕获组。捕获组捕获了错误的内容。
随机语句
可能意味着它是一些随机文本。您应该使用startsWith检查
。改为使用START\u SEQUENCE
。无论如何,逐行处理文件使用的内存比regex方法少。将其更改为
startsWith(“.START\u SEQUENCE”)
,并对该行进行修剪。非常感谢您花费时间构建这段工作代码。这样可以避免将两个部分合并到一个中的正则表达式样式效果,对吗?我会考虑这一点,即使在我的例子中,开始/结束标签只能在一个文件中出现一次。对于每个文件中的单个引用,只需绕过外部while循环。
import  java.util.ArrayList;
import  java.io.File;
import  java.io.IOException;
import  org.apache.commons.io.FileUtils;
import  org.apache.commons.io.LineIterator;

/**
   <P>{@code java BetweenLineMarkersButSkipFirstXmpl C:\java_code\\xbn\z\xmpl\text\regex\BetweenLineMarkersButSkipFirstXmpl_data.txt}</P>
**/
public class BetweenLineMarkersButSkipFirstXmpl  {
   public static final void main(String[] as_1RqdTxtFilePath)  {
      LineIterator li = null;
      try  {
         li = FileUtils.lineIterator(new File(as_1RqdTxtFilePath[0])); //Throws npx if null
      }  catch(IOException iox)  {
         throw  new RuntimeException("Attempting to open \"" + as_1RqdTxtFilePath[0] + "\"", iox);
      }  catch(RuntimeException rtx)  {
         throw  new RuntimeException("One required parameter: The path to the text file.", rtx);
      }

      String sLS = System.getProperty("line.separator", "\n");

      ArrayList<String> alsItems = new ArrayList<String>();
      boolean bStartMark = false;
      boolean bLine1Skipped = false;
      StringBuilder sdCurrentItem = new StringBuilder();
      while(li.hasNext())  {
         String sLine = li.next().trim();
         if(!bStartMark)  {
            if(sLine.startsWith(".START_SEQUENCE"))  {
               bStartMark = true;
               continue;
            }
            throw  new IllegalStateException("Start mark not found.");
         }  if(!bLine1Skipped)  {
            bLine1Skipped = true;
            continue;
         }  else if(!sLine.equals(".END_SEQUENCE"))  {
            sdCurrentItem.append(sLine).append(sLS);
         }  else  {
            alsItems.add(sdCurrentItem.toString());
            sdCurrentItem.setLength(0);
            bStartMark = false;
            bLine1Skipped = false;
            continue;
         }
      }

      for(String s : alsItems)  {
         System.out.println("----------");
         System.out.print(s);
      }
   }
}
.START_SEQUENCE RANDOM SENTENCE
3.40000
1 2 3 4
4 3 8 9
.END_SEQUENCE
.START_SEQUENCE RANDOM SENTENCE
3.40000
2 3 4 5
3 8 9 10
.END_SEQUENCE
[C:\java_code\]java BetweenLineMarkersButSkipFirstXmpl C:\java_code\BetweenLineMarkersButSkipFirstXmpl_data.txt
----------
1 2 3 4
4 3 8 9
----------
2 3 4 5
3 8 9 10