我正在尝试匹配一系列字符串,如下所示:
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);
请有人告诉我,我可能做错了什么。 谢谢
答案 0 :(得分:2)
我怀疑你问题的主要原因是你希望w+?
使w+
成为可选项,实际上它会使+
量词reluctant因此正则表达式将会仍尝试在此处找到至少一个或多个\\w
,使用^(\\w+
中的最后一个字符。
也许这样试试
Pattern.compile("^(\\w+(?:-\\w+)?)\\s+=\\s+\"(.*?)\"");
- > (\\w+(?:-\\w+)?)
部分将创建非捕获组(正则表达式不会将其视为组,因此(?:-\\w+)
将成为组(2),即使此部分将存在)和(.*?)
之后它将构成此部分可选的。
?
\"(.*?)\"
中的是reluctant quantifier,这将使正则表达式查找引号之间存在的最小匹配。
<强> Demo 强>
答案 1 :(得分:1)
这个正则表达式适合你:
^\w[\w-]*(?<=\w)\s*=\s*\"([^"]*)\"
在Java中:
Pattern p = Pattern.compile("^\\w[\\w-]*(?<=\\w)\\s*=\\s*\"([^\"]*)\"");
答案 2 :(得分:1)
您的问题是?
位置错误:
试试这个正则表达式:
^((\\w+-)?\\w+)\\s*=\\s*\"([^\"]+)\"
但请使用第1组和第3组。
我已经清理了正则表达式
答案 3 :(得分:0)
你想要这样的东西:
([\w\-]+)\s*=\s*"([^"]*)"
使用Java的额外反斜杠:
([\\w\\-]+)\\s*=\\s*\"([^\"]*)\"
如果您希望其他符号开始出现在变量名称中,您可以使其成为像[^=\s]
这样的字符类,以接受任何不是=或空格的字符。