Java中的正则表达式-提取特定符号之间的字符串

rbl8hiat  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(132)

我知道这种类型的问题已经被问了好几次(For example herehere),但似乎我的问题是不同的,因为我找不到解决方案。
假设我得到这个字符串:
key=false hotel = trivago foo cool='tr ue' feels="good"
(Be注意每个空格都是故意放在那里的)
我的意思是提取每对值,例如key=false就是其中之一。但是,如果一个单词在一些可选的空格之后没有“=”,我的意思是返回 word = null。否则,这是相关的部分,如果单词在符号'或“之间,我应该保存这些符号之间的任何内容。下面的例子可以解释我的意思:上面的例子是为了返回这个map:
{key=false, hotel=trivago, foo=null, cool=tr ue, feels=good}
我已经尝试了各种各样的模式来解决上面的问题。我觉得最接近我想要的是这个:([a-zA-Z0-9]+)\s*[= ]+(?![^\"']*[\"'])
其理念是:查找一个带数字的单词**([a-zA-Z 0 -9]+)**,后跟可选数量的空格。然后查找“="。这部分不是真实的的问题(我认为至少...)问题是我想要的组(2):为了考虑像“stuff”或“wo wsers”这样的例子,我查看了上面的链接,并考虑使用负前瞻。
我想这正是我需要的:group(2)应该包含=符号后面的所有内容。如果有“,则添加String中的任何内容,直到我们到达下一个“;同样的处理'。但是,如果没有提到的符号,停止在下一个空格。
我已经试了几个小时了,但我不知道更多的情况。谁能帮我吗?如果你还有问题,尽管问。
编辑:由于我被要求提供更多的例子,这里是:

example with a lot of words. Makes=sense.

应该返回

{example=null, with=null, a=null, lot=null, of=null, words.=null, Makes=sense.}

另一个例子:

Did=you know that=I like=           "cod ing"?

应该返回

{Did=you, know=null, that=I, like=cod ing?}
zed5wv10

zed5wv101#

我们可以使用以下正则表达式匹配所有方法:

String input = "key=false hotel    =       trivago foo       cool='tr  ue' feels=\"good\"";
Map<String, String> map = new HashMap<>();
String regex = "(\\S+)\\s*=\\s*(?:'(.*?)'|\"(.*?)\"|(\\S+))";
Pattern r = Pattern.compile(regex);
Matcher m = r.matcher(input);
while (m.find()) {
    String value = m.group(2);
    if (value == null) {
        value = m.group(3) == null ? m.group(4) : m.group(3);
    }
    map.put(m.group(1), value);
}

System.out.println(map);

// {feels=good, cool=tr  ue, hotel=trivago, key=false}

这里使用的正则表达式模式急切地试图在单引号或双引号中找到一个值。如果失败,它将值定义为任何连续的非空格字符组(\S+)。

相关问题