Java匹配带有可选连字符的字符串

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个回答

2
我猜测你遇到问题的主要原因是你期望w+?可以使w+变为可选项,但实际上它只会使量词+变得不贪婪,所以正则表达式仍然会尝试至少找到一个或多个\\w,并消耗掉^(\\w+中的最后一个字符。
也许可以尝试以下方法:
Pattern.compile("^(\\w+(?:-\\w+)?)\\s+=\\s+\"(.*?)\"");
  • (\\w+(?:-\\w+)?)中,(?:-\\w+)部分将创建一个非捕获组(正则表达式不会将其计算为组,因此即使存在这部分,(.*?)仍将是组(2)),并且后面的?将使此部分变为可选项。

  • \"(.*?)\"中,*?勉强量词,它将使正则表达式查找位于引号之间的最小匹配项。

演示


到目前为止,这是最好的答案。名称必须以一个或多个单词字符开头,如果有连字符,则必须跟随一个或多个单词字符。 - Alan Moore

1
这个正则表达式应该适用于您:

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

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

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


2
这个正则表达式将允许 ------="foo"。我非常确定这是不可以的。 - Bohemian
还不对。现在名称必须以单词字符开头,但仍然可以以连字符结尾和/或包含多个连续的连字符(例如 x----="foo")。 - Alan Moore
@AlanMoore:很好的提点,我又进行了编辑以处理这种情况。 - anubhava

1
你的问题是 ? 的位置不正确:
尝试这个正则表达式:
^((\\w+-)?\\w+)\\s*=\\s*\"([^\"]+)\"

但是使用1和3组。
我也稍微整理了一下正则表达式。

0
你想要这样的东西:
``` ([\w\-]+)\s*=\s*"([^"]*)" ```
对于 Java,需要额外的反斜杠:
``` ([\\w\\-]+)\\s*=\\s*\"([^\"]*)\" ```
如果您希望变量名中出现其他符号,则可以将其制作为字符类,例如 [^=\s] 来接受除 = 或空格之外的任何字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接