5

我正在尝试匹配一系列看起来像这样的字符串:

item1        = "some value"
item2        = "some value"

不过,我有一些字符串,看起来像这样:

item-one        = "some new value"
item-two        = "some new value"

我正在尝试使用正则表达式解析它,但我无法让它匹配可选的连字符。

这是我的正则表达式字符串:

 Pattern p = Pattern.compile("^(\\w+[-]?)\\w+?\\s+=\\s+\"(.*)\"");
 Matcher m = p.matcher(line);
 m.find();

 String option = m.group(1);
 String value  = m.group(2);

有人请告诉我我可能做错了什么。谢谢

4

4 回答 4

2

I suspect that main reason of your problem is that you are expecting w+? to make w+ optional, where in reality it will make + quantifier reluctant so regex will still try to find at least one or more \\w here, consuming last character from ^(\\w+.

Maybe try this way

Pattern.compile("^(\\w+(?:-\\w+)?)\\s+=\\s+\"(.*?)\"");
  • in (\\w+(?:-\\w+)?) -> (?:-\\w+) part will create non-capturing group (regex wont count it as group so (.*?) will be group(2) even if this part will exist) and ? after it will make this part optional.

  • in \"(.*?)\" *? is reluctant quantifier which will make regex to look for minimal match that exist between quotation marks.

Demo

于 2013-05-22T22:54:00.840 回答
1

这个正则表达式应该适合你:

^\w[\w-]*(?<=\w)\s*=\s*\"([^"]*)\"

在 Java 中:

Pattern p = Pattern.compile("^\\w[\\w-]*(?<=\\w)\\s*=\\s*\"([^\"]*)\"");

现场演示:http ://www.rubular.com/r/0CvByDnj5H

于 2013-05-22T22:52:10.090 回答
1

你的问题是你有?错误的地方:

试试这个正则表达式:

^((\\w+-)?\\w+)\\s*=\\s*\"([^\"]+)\"

但是使用第 1 组和第 3 组。

我也清理了一些正则表达式

于 2013-05-22T23:42:46.880 回答
0

你想要这样的东西:

([\w\-]+)\s*=\s*"([^"]*)"

为 Java 加上额外的反斜杠:

([\\w\\-]+)\\s*=\\s*\"([^\"]*)\"

例如,如果您希望其他符号开始出现在变量名称中,则可以将其设为一个字符类[^=\s],例如接受除 = 或空格以外的任何字符。

于 2013-05-22T22:52:28.800 回答