如何使用正则表达式解析此字符串?

时间:2010-11-10 03:10:09

标签: java regex

我有一个字符串:

"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");
}

4 个答案:

答案 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("^\"([^\"]+)\"");