当前位置: 首页 > 知识库问答 >
问题:

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

荀靖
2023-03-14

好吧,我知道有很多正则表达式问题,但是谢谢你花时间

编辑为已解决的代码

https://stackoverflow.com/a/25791942/8926366答案

我有一个文本文件,其中包含引号,我想把它们放入ArrayList中

我设法拼凑了以下regex代币,这是由我了解85%的指南和人员解决方案提供的:

(?

(?<=       # 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文件的人,尝试使用记事本或其他东西来替换所有各种可能的引用(确保检查结束和开始字符!)用一种引语

方法如下:(现在效果非常好)


  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个答案

万高轩
2023-03-14

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

"(?<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]*?"
 类似资料:
  • 我正在创建一个单词替换脚本。我遇到了一个路障,忽略引号之间的字符串,并且在这里找不到一个不涉及正则表达式的体面解决方案。 我有一个工作片段,它循环遍历字符串中的每个字符,并计算出最近的报价是开始报价还是结束报价(无论是单引号还是双引号),并忽略转义报价。问题是,为了提供100%准确的体验,它必须在每次字符串更改时运行(由于它的工作方式,它可以在单个函数中更改60K次),并且由于字符串长度的可能性,

  • 问题内容: 我试图编写一个正则表达式,该表达式返回括号之间的字符串。例如:我想获取位于字符串“(”和“)”之间的字符串 会回来 找到正则表达式以获取Javascript中两个字符串之间的字符串,但是我对regex并不陌生。我不知道如何在正则表达式中使用’(’,’)’ 问题答案: 您需要创建一组转义的(带有)括号(与括号匹配)和一组常规的括号来创建捕获组: 分解: :匹配左括号 :开始捕获组 :匹配

  • 我正在使用regex获取包含引号的字符串值。在下面的示例中,我希望得到值摘要键“Here is”summary。目前,我只得到“Here is”作为下面程序的输出。我希望转义位于第一个双引号和最后一个双引号之间的所有双引号。 谢谢你的帮助。

  • 此问题与RegEx有关:在引号之间抓取值 最佳答案中的正则表达式 用 Debuggex演示 还匹配以转义双引号开头的字符串。我试图将定义扩展到使用否定查找。 Debuggex演示 但这不会改变匹配模式中的任何内容。关于如何将转义单引号/双引号作为起始模式排除,有什么建议吗? 我想在支持regex lookback的nedit中使用它作为突出显示模式。 所需匹配的示例:

  • 问题内容: 我试图从圆括号中提取一个字符串。 比方说,我有,我只想输出字符串。 我找到了此链接和此正则表达式: 但是,我无法弄清楚如何获得想要的结果。 任何帮助,将不胜感激。谢谢! 问题答案: String str=”John Doe (123456789)”; System.out.println(str.substring(str.indexOf(“(“)+1,str.indexOf(“)”)

  • 问题内容: 不幸的是,尽管尽我所能记住,每年尝试至少一年学习一次正则表达式,但我却经常忘记,因为我很少使用它们。今年,我新年的决心是不要再尝试学习正则表达式因此,今年,为了避免让我流泪,我将把它交给Stack Overflow_ 。 我想以这种格式传递一个字符串,然后返回该字符串。有人能协助我们坚持我的新年决议吗? 问题答案: 如果您的字符串将始终是该格式,则正则表达式会显得过大: 表示以一个字符