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