正则表达式匹配模式,用于0次或更多次出现

时间:2013-06-02 05:40:26

标签: regex

我有一个格式为key: [value1, value2, value3]的字符串,其中值的出现可以是0,1,2或2以上

即。 key: []key: [value1]key: [value1, value2]key: [value1, value2, value3]

我正在尝试定义一个正则表达式,它将为我提供键和零个或多个值,不包括“,”作为正则表达式中的单独标记。我已经能够分离并获得密钥,但我无法将值作为单独的字符串获取。有人可以帮助我使用正则表达式吗?

3 个答案:

答案 0 :(得分:2)

我认为你不能用纯正则表达式做到这一点。最简单的方法可能是获取'key'和'values'([...]中的所有内容)abd然后将values-string拆分为值数组。
可以使用以下正则表达式:

([^\s=:+)\s*:\s*\[([^\]]*)\]

// E.g., in pseudocode:
(key, valuesStr) = match(pattern, originalString);
valuesArr = originalString.split(",\s*");

另请参阅PHP中的 short demo (其他语言的实现应该类似)。

答案 1 :(得分:0)

您可以使用以下正则表达式在[]中获取值,然后使用','

拆分字符串
  • 第1步:使用正则表达式在{]中获取值:\[(.*?)\]
  • 第2步:使用','
  • 拆分字符串

答案 2 :(得分:0)

你可以使用这个正则表达式

(\\w+):\\s*\\[(.*?)\\]

Group 1将包含密钥,group 2包含所有值。

现在您需要将group 2,

分开

在java中你可以这样做

1>创建KeyValue类

class KeyValue
{
    public final String key;
    public final List<String> values;
    public KeyValue(final String k,final List<String> val)
   {
        key=k;
        values=val;
   }
}

2&gt;现在以这种方式提取

KeyValue kv=null;
Pattern p = Pattern.compile("(\\w+):\\s*\\[(.*?)\\]");
Matcher m = p.matcher(input);
if(m.find())
{
    kv=new KeyValue(m.group(1),Arrays.asList(m.group(2).split("\\s*,\\s*")));
}

现在您的数据在KeyValue对象kv

kv.key;//key Name
for(String s:kv.values)
{
    s;//key value
}