我该如何使用正则表达式解析这个字符串?

3

我有一个字符串:

"GOOG",625.00,"-1.95 - -0.31%"

我正在使用这个模式,但它没有匹配成功。我想获取GOOG。我做错了什么?
Pattern pattern = Pattern.compile("^\"([^\"]+)");
Matcher matcher = pattern.matcher(line);

if (matcher.matches()) {
    Log.i(TAG, matcher.group(0));
} else {
    Log.i(TAG, "no match");
}

这个模式看起来对我来说还不错 - 你能通过写出前几个字符来验证一下“line”不是以换行符或其他疯狂的东西开头吗? - cdhowie
使用正则表达式来解析某些东西效率极低。相反,使用它来匹配某些东西,并使用一个完整的解析器来解析某些东西。对于CSV,存在CSV解析器(就像对于HTML存在HTML解析器一样...)。 - BalusC
4个回答

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("\"", "");

3
(或者更好的选择,使用一个解析 CSV 文件的库) - user166390
1
假设 GOOG 不会有逗号,但我认为这很不可能,因为这会惹恼很多股票交易者 :-) - paxdiablo

1
Java的`matches()`方法期望正则表达式与整个字符串匹配,就好像它在两端都锚定了`^`和`$`(或`\A`和`\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()选项,如下所示:

Pattern pattern = Pattern.compile("\"([^\"]+)");
Matcher matcher = pattern.matcher(line);

if (matcher.find()) {
    Log.i(TAG, matcher.group(1));
} else {
    Log.i(TAG, "no match");
}

这个正则表达式匹配第一个引号后跟着一个或多个非引号字符(这些字符被捕获在第一组中)。它可以匹配任何位置;如果你想只匹配字符串的开头,你必须使用^锚点,就像你在原始正则表达式中使用的那样:"^\"([^\"]+)"

(还有一个lookingAt()方法,它自动将匹配锚定到字符串的开头但不是结尾,但没有人使用它。)


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

0

尝试这个正则表达式:

^"(?<text>[^"]+?)"

我认为你漏掉了第二个引号(在GOOG之后的那个)

编辑:

Pattern pattern = Pattern.compile("^\"([^\"]+)\"");

(?<XYZ>...) 是指定命名组的方式,但Java正则表达式目前还不支持它们(它们将在Java 7中推出)。在这种情况下省略第二个引号不是错误;当匹配项用完非引号字符时,[^\"]+ 将停止匹配。 (但我仍建议添加闭合引号,以避免混淆。) - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接