为什么这个java正则表达式返回false?

时间:2017-04-14 17:08:44

标签: java regex

我的目的是使用String :: split()方法找到所有“标记”和引用的字符串:

(("[\w\s]*")|(\w*))*

输入文字:

this  "a test" abd "and more"

它总是返回false。

另外,我如何“引用”它以便我可以在源代码中使用它?

1 个答案:

答案 0 :(得分:1)

String.split使用匹配作为分隔符进行拆分,即返回匹配的所有内容。如果您想要返回您匹配的内容,则应使用Matcher.find

此外,\\w*匹配长度为0的字符串,您可能希望避免这种情况。使用+匹配1个或更多。

你也有一些不必要的括号而外部*不应该存在 - 正则表达式的其余部分已经匹配单个标记中的所有字符,并且多个标记应该可以匹配正则表达式匹配的多个调用(所以说"其中任何一些"都没有意义。)

Matcher m = Pattern.compile("\"[\\w\\s]*\"|\\w+").matcher("this  \"a test\" abd \"and more\"");
while (m.find())
    System.out.println(m.group());

以上版画:

this
"a test"
abd
"and more"

要删除引号,您可以更新正则表达式以使用look-around,这将检查"是否存在,但实际上并未匹配它们<\ n < / p>

"(?<=\")\\w[\\w\\s]*(?=\")|\\w+"

要了解如何逃避事情,您需要牢记不同的层面。首先是Java本身,其中"会开始或结束字符串,因此如果您希望\字符出现,则需要使用"进行转义一个字符串。然后是正则表达式代码,它需要\w\s,但Java不允许\在没有转义的情况下使用\\w,因此\\s ERROR in /PATH_REMOVED/$$_gendir/app/dashboard-chart/dashboard-chart.component.ngfactory.ts (49,9): Supplied parameters do not match any signature of call target. ng serve --aot --prod 1}}和import { Component, OnInit, OnChanges, Input, ViewChild, ElementRef, ViewEncapsulation } from '@angular/core'; @Component({ selector: 'dashboard-chart', templateUrl: './dashboard-chart.component.html', styleUrls: ['./dashboard-chart.component.css'], encapsulation: ViewEncapsulation.None }) export class DashboardChartComponent implements OnInit, OnChanges { @ViewChild('chart') chartContainer: ElementRef; @Input() data: any[]; constructor() { } ngOnInit() { } ngOnChanges() { } }