使用正则表达式从Java中的txt文件中的引号之间获取String

时间:2019-04-04 20:39:14

标签: java regex

好的,我知道那里有很多正则表达式问题,但谢谢您抽出宝贵的时间

已编辑为已解决的代码

https://stackoverflow.com/a/25791942/8926366给出了答案

我有一个带引号的文本文件,我想将其放在ArrayList<String>中。为此,我正在使用ScannerFile方法,并且我想使自己熟悉正则表达式,因为这似乎是一种非常有效的方法。当然我似乎无法正常工作!

我设法将以下正则表达式令牌归纳在一起,这些指南和人员解决方案由我了解的大约85%的人提供:

(?<=(["']\b))(?:(?=(\\?))\2.)*?(?=\1)现在我是这样理解的:

(?<=       # positive lookbehind group1
  (        # for this new group group2
   ["']    # the characters I am looking for
   \b      # word boundary anchor
  )        # end group2
)          # end group1
(?:        # non-capturing group3
  (?=      # lookahead group4
    (\\?)  # I still have no idea what this means exactly
  )        # end group 4
  \2       # matching the contents of the 2nd group in the expression.
)          # end group3
*?         # lazy 
(?=\1)     # look ahead for group 1

我现在确认它不起作用哈哈

这是可行的(由于我的法语键盘,从[\“]中删除了',将逗号与法语引号分开会太长了,在这种情况下没什么大问题)

([[\“])((?:(?=(\\?))\ 3。)*?)\ 1

输入:

“两件事是无限的:宇宙和人类的愚蠢;而我不确定宇宙。”

“善于思考的人经常犯重大错误” –马丁·海德格尔

它给出:

两件事是无限的:宇宙和人类的愚蠢。我不确定宇宙。

思想高超的人经常犯错误

对于所有对为什么他们的正则表达式不能用于txt文件感到困惑的人-尝试使用notepad ++或用某种引号替换所有可能的引号(确保检查关闭和打开字符!)< / p>

这里是方法:(现在效果很好)


  public class WitticismFileParser {

   ArrayList<String> witticisms;
   Scanner scan;
   String regex="([\"])((?:(?=(\\\\?))\\3.)*?)\\1"; //"(?s)([\"])((?<quotedText>(?=(\\\\?))\\3.)*?)(?<[\"])";
   public ArrayList<String> parse(String FILE_PATH){

       witticisms = new ArrayList<>();
       Pattern pattern = Pattern.compile(regex);


       try{
           File txt= new File(FILE_PATH);
           scan= new Scanner(txt);
           String line="";
           Matcher matcher;
           matcher=pattern.matcher(line);

           while(scan.hasNext()){
               line=scan.nextLine();
               matcher=matcher.reset(line);

               if (matcher.find()){
                   line=matcher.group(2);
                   witticisms.add(line);
                   System.out.println(line);
               }

           }

       }catch(IOException e){
           System.err.println("IO Exception- "+ e.getMessage());
           e.printStackTrace();

       }catch(Exception e){
           System.err.println("Exception- "+e.getMessage());
           e.printStackTrace();
       }finally{
           if(scan!=null)
               scan.close();       
       }

       return witticisms;
   }

}

在此处保留故障排除

当我在扫描仪得到它时直接使它直接打印时,我看到输入文本符合预期。我确保重新格式化.txt格式,以便所有引号也都相同

无论如何,谢谢您的帮助,阅读正则表达式文档让我头疼不已

感谢所有回答的人!

1 个答案:

答案 0 :(得分:0)

为什么不简单使用下面的正则表达式?

"(?<textBetweenQuotes>[\s\S]*?)"

" matches the character " literally.
(?<textBetweenQuotes> is the start of a named capture group.
[\s\S]*? matches any character including newlines between zero or an infinite amount of times but lazily (so stopping as soon as possible).
) is the end of the named capture group.
" matches the character " literally.

如果您不能在程序中使用命名捕获组,则始终可以在不使用正则表达式的情况下使用它,并替换其中的引号。

"[\s\S]*?"