我正在尝试使用模式Matcher java
搜索下面的单词在doc中搜索的Word:
(peak: somevalue) [
代码:
Matcher m= Pattern.compile("\\(peak:(.*?)\\)\\s[").matcher(currLine);
但没有得到预期的结果。
希望获得"某些价值"使用这个模式,请你指导我。
答案 0 :(得分:1)
此代码为您提供正确的结果:
String s="(peak: somevalue) [";
Matcher m= Pattern.compile("\\(peak:(.*?)\\)\\s\\[").matcher(s);
m.find();
System.out.println(m.group(1));
答案 1 :(得分:1)
您需要在正则表达式结束时转义[
,因为它也是用于创建[...]
character class
Pattern.compile("\\(peak:(.*?)\\)\\s\\[")
//here -----------------------------^^
并且您可以在\\s?
之前添加(.*?)
,以便在第1组匹配中peak:
之后不包含空格。
所以你的代码看起来像
Matcher m = Pattern.compile("\\(peak:\\s?(.*?)\\)\\s\\[").matcher(currLine);
if(m.find())
System.out.println(m.group(1));
// ^^^ group 1 will contain match from `(.*?)`
顺便说一句,看起来你应该使用正在尝试分析的语言解析器而不是正则表达式。如果您使用.*?
,正则表达式可以为您提供许多问题,例如假阳性匹配,因为点.
可以接受任何字符,因此在您的案例模式中"\\(peak:\\s?(.*?)\\)\\s\\["
将接受以{{1}开头的任何字符串和} (peak:
一样以) [
结尾。
要解决此类问题,您需要更具体地说明应该接受哪种字符(peak:whatever)()<foo>{bar}{}(blah) [
。其中一个想法是让它接受不是whatever
的字符,以便您可以尝试使用
)
答案 2 :(得分:0)
你的冒号与(。*?)
的“任何捕获”之间需要一个\ s