好的,我知道那里有很多正则表达式问题,但谢谢您抽出宝贵的时间
已编辑为已解决的代码
https://stackoverflow.com/a/25791942/8926366给出了答案
我有一个带引号的文本文件,我想将其放在ArrayList<String>
中。为此,我正在使用Scanner
和File
方法,并且我想使自己熟悉正则表达式,因为这似乎是一种非常有效的方法。当然我似乎无法正常工作!
我设法将以下正则表达式令牌归纳在一起,这些指南和人员解决方案由我了解的大约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格式,以便所有引号也都相同
无论如何,谢谢您的帮助,阅读正则表达式文档让我头疼不已
感谢所有回答的人!
答案 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]*?"