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

Java 如何用正则表达式解析这个字符串?,java,regex,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

我有一个字符串,比如:

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

问题是您没有运行
matcher.find()。如果您将其更改为:

if (matcher.find()) {
尽管如果您只使用
String.split
方法(或者更好地使用库解析CSV文件),这似乎会更容易:


首先需要调用matcher.find()

试试这个正则表达式:

^"(?<text>[^"]+?)"
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");
}
Pattern pattern = Pattern.compile("\"([^\"]+)");
Matcher matcher = pattern.matcher(line);

if (matcher.find()) {
    Log.i(TAG, matcher.group(1));
} else {
    Log.i(TAG, "no match");
}
regex开头的
^
没有造成任何危害,我只是删除了它以表明它没有必要。请注意,我还将
组(0)
更改为
组(1)
——这是代码中的另一个错误<代码>组(0)
是整个匹配,而
组(1)
仅指在第一组捕获括号中匹配的部分

您还可以选择使用
find()
,如下所示:

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");
}
Pattern pattern = Pattern.compile("\"([^\"]+)");
Matcher matcher = pattern.matcher(line);

if (matcher.find()) {
    Log.i(TAG, matcher.group(1));
} else {
    Log.i(TAG, "no match");
}
这匹配引号的第一个实例,后跟引号以外的一个或多个字符(在组#1中捕获)。这将在任何地方匹配;如果希望它仅在字符串的最开始处匹配,则必须使用原始正则表达式中的
^
锚定:
“^\”([^\“]+)”


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

我觉得这个模式很好——你能通过写出“行”的前几个字符来验证吗不是以换行符或类似疯狂的东西开始的吗?使用正则表达式解析某些东西是非常低效的。而是使用它来匹配某些内容,并使用一个完整的解析器来解析某些内容。对于CSV来说是存在的(就像HTML解析器存在于HTML…。”(或者更好的是,[使用]一个用于解析CSV文件的库)“假设
GOOG
中永远不会有逗号,但我认为这不太可能,因为这会惹恼很多股票交易员:-)
(?…)
是指定命名组的方式,但Java正则表达式还不支持这些(它们来自Java 7)。在这种情况下,省略第二个引号不是错误;
[^\“]+
将在没有引号时停止匹配。(但我还是会添加结束引号,以避免混淆。)
Pattern pattern = Pattern.compile("\"([^\"]+)");
Matcher matcher = pattern.matcher(line);

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