我有一个字符串:
"GOOG",625.00,"-1.95 - -0.31%"
我正在使用这种模式,但它不匹配。我想要搞笑。我究竟做错了什么?
Pattern pattern = Pattern.compile("^\"([^\"]+)");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
Log.i(TAG, matcher.group(0));
} else {
Log.i(TAG, "no match");
}
答案 0 :(得分:3)
问题是你没有运行matcher.find()
所以表达式永远不会被真正评估。如果您将其更改为:
if (matcher.find()) {
虽然看起来如果你只使用String.split
方法(或者更好,使用库来解析CSV文件)会更容易:
String temp = "\"GOOG\",625.00,\"-1.95 - -0.31%\"";
String[] parts = temp.split(",");
String symbol = temp[0].replaceAll("\"", "");
答案 1 :(得分:1)
Java的matches()
方法期望正则表达式匹配整个字符串,就像它在^
和$
(或\A
和{{1}两端锚定一样}})。每当你使用\z
一个只匹配部分字符串的正则表达式时,你需要用matches()
“填充”正则表达式,如下所示:
.*
正则表达式开头的Pattern pattern = Pattern.compile("\"([^\"]+).*");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
Log.i(TAG, matcher.group(1)); // not group(0)!
} else {
Log.i(TAG, "no match");
}
没有造成任何伤害,我只是删除它以表明没有必要。请注意,我还将您的^
更改为group(0)
- 这是代码中的另一个错误。 group(1)
是完整匹配,而group(0)
仅指在第一组捕获括号中匹配的部分。
您还可以选择使用group(1)
,如下所示:
find()
这匹配引号的第一个实例,后跟除引号之外的一个或多个字符(在组#1中捕获)。这将匹配任何地方;如果您希望它仅在字符串的最开头匹配,则必须使用原始正则表达式中的Pattern pattern = Pattern.compile("\"([^\"]+)");
Matcher matcher = pattern.matcher(line);
if (matcher.find()) {
Log.i(TAG, matcher.group(1));
} else {
Log.i(TAG, "no match");
}
锚点:^
(还有一个"^\"([^\"]+)"
方法,它会自动将匹配锚定到字符串的开头而不是结尾,但是没有人使用它。)
答案 2 :(得分:0)
首先需要调用matcher.find()
String temp = "\"GOOG\",625.00,\"-1.95 - -0.31%\"";
Pattern pattern = Pattern.compile("\"[a-zA-Z]*\"");
Matcher matcher = pattern.matcher(temp);
if(matcher.find()){
Log.i(TAG, matcher.group(0).split("\"")[1]);
} else {
Log.i(TAG, "no match");
}
答案 3 :(得分:0)
尝试正则表达式:
^"(?<text>[^"]+?)"
我认为你错过了第二个“(追逐了一个人”)
编辑:
Pattern pattern = Pattern.compile("^\"([^\"]+)\"");