Java匹配字符串和可选的连字符

时间:2013-05-22 22:46:28

标签: java regex

我正在尝试匹配一系列字符串,如下所示:

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 个答案:

答案 0 :(得分:2)

我怀疑你问题的主要原因是你希望w+?使w+成为可选项,实际上它会使+量词reluctant因此正则表达式将会仍尝试在此处找到至少一个或多个\\w,使用^(\\w+中的最后一个字符。

也许这样试试

Pattern.compile("^(\\w+(?:-\\w+)?)\\s+=\\s+\"(.*?)\"");
    <{>}}中的
  • - &gt; (\\w+(?:-\\w+)?)部分将创建非捕获组(正则表达式不会将其视为组,因此(?:-\\w+)将成为组(2),即使此部分将存在)和(.*?)之后它将构成此部分可选的。

  • ? \"(.*?)\"中的
  • reluctant quantifier,这将使正则表达式查找引号之间存在的最小匹配。

<强> Demo

答案 1 :(得分:1)

这个正则表达式适合你:

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

在Java中:

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

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

答案 2 :(得分:1)

您的问题是?位置错误:

试试这个正则表达式:

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

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

我已经清理了正则表达式

答案 3 :(得分:0)

你想要这样的东西:

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

使用Java的额外反斜杠:

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

如果您希望其他符号开始出现在变量名称中,您可以使其成为像[^=\s]这样的字符类,以接受任何不是=或空格的字符。